Python:为什么运算符“is”和“==”有时可以互换为字符串?

时间:2012-10-03 09:18:12

标签: python python-2.7 operators

  

可能重复:
  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
>>> 

为什么在一种情况下操作符可以互换而在另一种情况下不可以?

3 个答案:

答案 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