可能重复:
String comparison in Python: is vs. ==
Python string interning
Why does comparing strings in Python using either '==' or 'is' sometimes produce a different result?
我偶然使用is
和==
互换字符串,但我发现并不总是一样。
>>> Folder = "locales/"
>>> Folder2 = "locales/"
>>> Folder is Folder2
False
>>> Folder == Folder2
True
>>> File = "file"
>>> File2 = "file"
>>> File is File2
True
>>> File == File2
True
>>>
为什么在一种情况下操作符可以互换而在另一种情况下不可以?
答案 0 :(得分:12)
短字符串是为了提高效率而实现的,因此将引用相同的对象,因此is
将成立。
这是CPython中的一个实现细节,绝对不能依赖它。
答案 1 :(得分:4)
这个问题更加清晰:String comparison in Python: is vs. ==
简短的回答是: ==
测试等值,其中is
测试同等身份(通过对象引用)。
2个具有相同值的字符串具有相同的标识这一事实表明python解释器正在优化,正如Daniel Roseman所证实的那样:)
答案 2 :(得分:3)
==
运算符调用第一个对象的内部__cmp__()
方法,将其与第二个对象进行比较。这适用于所有Python对象,包括字符串。 is
运算符比较对象标识:
每个对象都有一个标识,一个类型和一个值。对象的标识一旦创建就永远不会改变;您可能会将其视为内存中对象的地址。 'is'运算符比较两个对象的身份; id()函数返回一个表示其身份的整数(当前实现为其地址)。
E.g:
s1 = 'abc'
id(s1)
>>> 140058541968080
s2 = 'abc'
id(s2)
>>> 140058541968080
# The values the same due to SPECIFIC CPython behvaiour which detects
# that the value exists in interpreter's memory thus there is no need
# to store it twice.
s1 is s2
>>> True
s2 = 'cde'
id(s2)
>>> 140058541968040
s1 is s2
>>> False