2014-01-31 124 views
4

我想下面的代码:Python:'is'和'=='有什么区别?

x = 'asd' 
y = 'asd' 
z = input() #write here string 'asd'. For Python 2.x use raw_input() 
x == y # True. 
x is y # True. 
x == z # True. 
x is z # False. 

为什么我们在最后一个表达式假的?

+0

对于小字符串部分:['是''操作符在与空格比较字符串时的行为有所不同](http://stackoverflow.com/questions/16756699/is-operator-behaves-differently-when-comparing-strings-with-空格) –

+0

我不认为这是重复的。标题是误导性的,但我认为它具体是为什么输入的字符串不一样。与其他问题一样,它也不包含空格。 –

+1

这个问题可能稍有不同,但答案是一样的 - “is”偶尔可以作为cpython中的实现细节。涉及投入的事实并不特别特别;外卖应该是永远不要使用'is'。 – geoffspear

回答

13

is检查身份a is bTrue iff ab是相同的对象(它们都存储在相同的存储器地址中)。

==检查平等,这通常是由魔术方法__eq__定义 - 即a == bTrue如果a.__eq__(b)True

就你而言,Python特别优化了两个硬编码字符串到同一个对象中(因为字符串是不可变的,所以没有危险)。由于input()将在运行时创建一个字符串,因此无法进行该优化,因此会创建一个新的字符串对象。

+0

而来的--input()将在运行时创建一个字符串 x = 5 y = int(input())#<< 5 x == y #True x is y #True ! 但是y也是在运行时创建的。 –

2

is检查对象是否相等,但是如果对象实际上是相同的对象。由于input()总是创建一个新的字符串,因此它永远不会is另一个字符串。

Python为所有出现的相同字符串文字创建一个对象,这就是为什么xy指向同一个对象。