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

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

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

为什么会这样?


当前回答

如果你不确定你在做什么,使用'=='。 如果你对它有更多的了解,你可以用'is'来表示已知的对象,比如'None'。

否则,你最终会想知道为什么事情不管用,为什么会发生这种情况:

>>> a = 1
>>> b = 1
>>> b is a
True
>>> a = 6000
>>> b = 6000
>>> b is a
False

我甚至不确定在不同的Python版本/实现之间是否保证有一些东西保持不变。

其他回答

Is是同一性测试,==是相等性测试。这意味着is是一种检查两件事物是否相同或等价的方法。

假设你有一个简单的person对象。如果它的名字是“Jack”,而且是“23岁”,那么它就相当于另一个23岁的Jack,但它不是同一个人。

class Person(object):
   def __init__(self, name, age):
       self.name = name
       self.age = age

   def __eq__(self, other):
       return self.name == other.name and self.age == other.age

jack1 = Person('Jack', 23)
jack2 = Person('Jack', 23)

jack1 == jack2 # True
jack1 is jack2 # False

他们年龄相同,但他们不是同一个人。一个字符串可能与另一个字符串等价,但它不是同一个对象。

Is是同一性测试,==是相等性测试。在你的代码中发生的事情将在解释器中模拟,就像这样:

>>> a = 'pub'
>>> b = ''.join(['p', 'u', 'b'])
>>> a == b
True
>>> a is b
False

所以,难怪它们不一样,对吧?

换句话说,a等于b等于id(a) == id(b)

如果你不确定你在做什么,使用'=='。 如果你对它有更多的了解,你可以用'is'来表示已知的对象,比如'None'。

否则,你最终会想知道为什么事情不管用,为什么会发生这种情况:

>>> a = 1
>>> b = 1
>>> b is a
True
>>> a = 6000
>>> b = 6000
>>> b is a
False

我甚至不确定在不同的Python版本/实现之间是否保证有一些东西保持不变。

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

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

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

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

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

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