我想下面的代码: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.
为什么我们在最后一个表达式假的?
我想下面的代码: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.
为什么我们在最后一个表达式假的?
is
检查身份。 a is b
是True
iff a
和b
是相同的对象(它们都存储在相同的存储器地址中)。
==
检查平等,这通常是由魔术方法__eq__
定义 - 即a == b
是True
如果a.__eq__(b)
是True
。
就你而言,Python特别优化了两个硬编码字符串到同一个对象中(因为字符串是不可变的,所以没有危险)。由于input()
将在运行时创建一个字符串,因此无法进行该优化,因此会创建一个新的字符串对象。
而来的--input()将在运行时创建一个字符串 x = 5 y = int(input())#<< 5 x == y #True x is y #True ! 但是y也是在运行时创建的。 –
is
检查对象是否相等,但是如果对象实际上是相同的对象。由于input()
总是创建一个新的字符串,因此它永远不会is
另一个字符串。
Python为所有出现的相同字符串文字创建一个对象,这就是为什么x
和y
指向同一个对象。
对于小字符串部分:['是''操作符在与空格比较字符串时的行为有所不同](http://stackoverflow.com/questions/16756699/is-operator-behaves-differently-when-comparing-strings-with-空格) –
我不认为这是重复的。标题是误导性的,但我认为它具体是为什么输入的字符串不一样。与其他问题一样,它也不包含空格。 –
这个问题可能稍有不同,但答案是一样的 - “is”偶尔可以作为cpython中的实现细节。涉及投入的事实并不特别特别;外卖应该是永远不要使用'is'。 – geoffspear