为什么字符串相等不能按预期在这个Python代码中工作?

Why does string equality not working in this Python code as expected?

本问题已经有最佳答案,请猛点这里访问。

注意:在你去投反对票或结束我的问题,或把它标记为副本之前,让我向你保证,我已经搜索了几十个类似的问题,并在网上搜索了一个多小时,但我仍然没有解决这个问题。没有其他答案解决了我的问题。

问题我有这个python代码:

1
2
3
4
5
6
7
8
9
10
text = ''
text += '<' + '/' + '>'

print text, '</>'
print repr(text), repr('</>')

if text is '</>':
    print 'Equal'
else:
    print 'Not equal!'

我只想比较两条弦。出于某种原因,我需要将字符逐个连接到text。我希望if语句能对True进行评估,但事实并非如此。我也不知为什么!

输出结果如下:


'' ''
Not equal!

我刚接触过python,现在使用的是python 2.7。有人能帮忙吗?


你需要使用==,而不是isis检查对象标识是否不相等。

例如

假设你有foobar

1
2
3
4
5
6
>>> foo = 'green eggs and ham'
>>> bar = 'green eggs and ham'
>>> foo is bar
>>> False
>>> foo == bar
>>> True

在我的机器上:

1
2
3
4
>>> id(foo)
>>> 52008832
>>> id(bar)
>>> 52010560

现在,看看这个:

1
2
3
>>> foobar = bar
>>> foobar is bar
>>> True

这是真的,因为我们已经将变量foobar别名为指向引用的bar。显然,它们在这个别名下引用了相同的位置。因此,IS返回真值。

更有趣的是,考虑两个ints。这只适用于小整数(-2556)。

1
2
3
4
5
6
>>> foo = 123
>>> bar = 123
>>> foo is bar
>>> True
>>> id(foo)
>>> 1993000432 # == id(bar)

ints(-2556)被缓存,因此此范围内的int将使用is来比较对象标识,以eval到true。


在我使用Python的整个历史中,我从来没有使用过is(这可能是因为我在使用oop时仍然有困难)。只需使用规则的相等运算符==