两个字符串变量被设置为相同的值。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用于恒等比较,而==用于相等比较。由于您关心的是相等性(两个字符串应该包含相同的字符),在这种情况下,is操作符是错误的,您应该使用==代替。
原因是交互工作的(大多数)字符串字面量是默认的。从维基百科:
Interned strings speed up string comparisons, which are sometimes a performance bottleneck in applications (such as compilers and dynamic programming language runtimes) that rely heavily on hash tables with string keys. Without interning, checking that two different strings are equal involves examining every character of both strings. This is slow for several reasons: it is inherently O(n) in the length of the strings; it typically requires reads from several regions of memory, which take time; and the reads fills up the processor cache, meaning there is less cache available for other needs. With interned strings, a simple object identity test suffices after the original intern operation; this is typically implemented as a pointer equality test, normally just a single machine instruction with no memory reference at all.
因此,当你在程序中有两个具有相同值的字符串字面量(字面上输入到程序源代码中的单词,被引号包围)时,Python编译器将自动对字符串进行替换,使它们都存储在相同的内存位置。(请注意,这种情况并不总是发生,发生这种情况的规则相当复杂,所以请不要在生产代码中依赖这种行为!)
由于在交互式会话中,两个字符串实际上存储在相同的内存位置,因此它们具有相同的标识,因此is操作符可以正常工作。但是如果您通过其他方法构造一个字符串(即使该字符串包含完全相同的字符),那么字符串可能是相等的,但它不是相同的字符串——也就是说,它具有不同的标识,因为它存储在内存中的不同位置。
其他回答
根据我有限的Python使用经验,is用于比较两个对象,以确定它们是否是相同的对象,而不是具有相同值的两个不同对象。==用于确定两个值是否相同。
这里有一个很好的例子:
>>> s1 = u'public'
>>> s2 = 'public'
>>> s1 is s2
False
>>> s1 == s2
True
s1是Unicode字符串,s2是普通字符串。它们不是相同的类型,但它们的值相同。
is关键字是测试对象身份,而==是值比较。
如果使用is,当且仅当对象是同一对象时,结果将为真。但是,当对象的值相同时,==将为真。
我认为这与这样一个事实有关,当'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是同一性测试,==是相等性测试。在你的代码中发生的事情将在解释器中模拟,就像这样:
>>> a = 'pub'
>>> b = ''.join(['p', 'u', 'b'])
>>> a == b
True
>>> a is b
False
所以,难怪它们不一样,对吧?
换句话说,a等于b等于id(a) == id(b)
基本概念,我们必须清楚,在处理这个问题时,是理解is和==之间的区别。
is将比较内存位置。如果id(a)==id(b),则a是b返回true,否则返回false。
所以,我们可以说is是用来比较内存位置的。然而,
==用于相等性测试,这意味着它只比较结果值。下面显示的代码可以作为上述理论的一个例子。
Code
对于字符串字面值(未分配给变量的字符串),内存地址将与图中所示相同。所以,id (a) (b) = = id。剩下的是不言自明的。