两个字符串变量被设置为相同的值。s1 == s2总是返回True,但s1 = s2有时返回False。
如果我打开我的Python解释器,并做同样的比较,它成功了:
>>> s1 = 'text'
>>> s2 = 'text'
>>> s1 is s2
True
为什么会这样?
两个字符串变量被设置为相同的值。s1 == s2总是返回True,但s1 = s2有时返回False。
如果我打开我的Python解释器,并做同样的比较,它成功了:
>>> s1 = 'text'
>>> s2 = 'text'
>>> s1 is s2
True
为什么会这样?
当前回答
我认为这与这样一个事实有关,当'is'比较的结果为false时,使用了两个不同的对象。如果它的计算值为true,这意味着它在内部使用相同的对象,而不是创建一个新的对象,可能是因为你在不到2秒的时间内创建了它们,并且在优化和使用相同的对象之间没有很大的时间间隔。
这就是为什么你应该使用相等操作符==,而不是is,来比较字符串对象的值。
>>> s = 'one'
>>> s2 = 'two'
>>> s is s2
False
>>> s2 = s2.replace('two', 'one')
>>> s2
'one'
>>> s2 is s
False
>>>
在这个例子中,我创建了s2,它是一个不同的字符串对象,之前等于'one',但它与s不是同一个对象,因为解释器没有使用相同的对象,因为我最初没有将它赋值给'one',如果我有的话,它会使它们成为相同的对象。
其他回答
如果你不确定你在做什么,使用'=='。 如果你对它有更多的了解,你可以用'is'来表示已知的对象,比如'None'。
否则,你最终会想知道为什么事情不管用,为什么会发生这种情况:
>>> a = 1
>>> b = 1
>>> b is a
True
>>> a = 6000
>>> b = 6000
>>> b is a
False
我甚至不确定在不同的Python版本/实现之间是否保证有一些东西保持不变。
is是身份测试,==是相等测试(请参阅Python文档)。
在大多数情况下,如果a是b,那么a == b。但也有例外,例如:
>>> nan = float('nan')
>>> nan is nan
True
>>> nan == nan
False
所以,你只能在同一性测试中使用is,而不是相等性测试。
将比较内存位置。它用于对象级比较。
==将比较程序中的变量。它用于在值级别上进行检查。
是否检查地址级别等价性
==检查值级别是否等价
基本概念,我们必须清楚,在处理这个问题时,是理解is和==之间的区别。
is将比较内存位置。如果id(a)==id(b),则a是b返回true,否则返回false。
所以,我们可以说is是用来比较内存位置的。然而,
==用于相等性测试,这意味着它只比较结果值。下面显示的代码可以作为上述理论的一个例子。
Code
对于字符串字面值(未分配给变量的字符串),内存地址将与图中所示相同。所以,id (a) (b) = = id。剩下的是不言自明的。
实际上,is操作符检查是否相同,而==操作符检查是否相等。
从语言参考:
Types affect almost all aspects of object behavior. Even the importance of object identity is affected in some sense: for immutable types, operations that compute new values may actually return a reference to any existing object with the same type and value, while for mutable objects this is not allowed. E.g., after a = 1; b = 1, a and b may or may not refer to the same object with the value one, depending on the implementation, but after c = []; d = [], c and d are guaranteed to refer to two different, unique, newly created empty lists. (Note that c = d = [] assigns the same object to both c and d.)
因此,从上面的语句中,我们可以推断出字符串是不可变类型,当使用"is"检查时可能会失败,而当使用"is"检查时可能会成功。
同样适用于int和tuple,它们也是不可变类型。