两个字符串变量被设置为相同的值。s1 == s2总是返回True,但s1 = s2有时返回False。

如果我打开我的Python解释器,并做同样的比较,它成功了:

>>> s1 = 'text'
>>> s2 = 'text'
>>> s1 is s2
True

为什么会这样?


当前回答

is是身份测试,==是相等测试(请参阅Python文档)。

在大多数情况下,如果a是b,那么a == b。但也有例外,例如:

>>> nan = float('nan')
>>> nan is nan
True
>>> nan == nan
False

所以,你只能在同一性测试中使用is,而不是相等性测试。

其他回答

根据我有限的Python使用经验,is用于比较两个对象,以确定它们是否是相同的对象,而不是具有相同值的两个不同对象。==用于确定两个值是否相同。

这里有一个很好的例子:

>>> s1 = u'public'
>>> s2 = 'public'
>>> s1 is s2
False
>>> s1 == s2
True

s1是Unicode字符串,s2是普通字符串。它们不是相同的类型,但它们的值相同。

is关键字是测试对象身份,而==是值比较。

如果使用is,当且仅当对象是同一对象时,结果将为真。但是,当对象的值相同时,==将为真。

最后需要注意的是,你可以使用sys.intern函数来确保你得到的是同一个字符串的引用:

>>> from sys import intern
>>> a = intern('a')
>>> a2 = intern('a')
>>> a is a2
True

正如在前面的回答中指出的,您不应该使用is来确定字符串的相等性。但这可能有助于了解您是否有一些奇怪的要求使用is。

注意,intern函数曾经是Python 2的内置函数,但在Python 3中被移到了sys模块中。

将比较内存位置。它用于对象级比较。

==将比较程序中的变量。它用于在值级别上进行检查。

是否检查地址级别等价性

==检查值级别是否等价

这是一个边注,但在惯用的Python中,你经常会看到这样的东西:

if x is None:
    # Some clauses

这是安全的,因为保证有一个Null对象的实例(即None)。