Python:'is'和'=='之间有什么区别?

4
我正在尝试下面的代码:

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.

为什么最后的表达式会出现false?

对于小字符串部分:is操作符在比较带有空格的字符串时表现不同 - Ashwini Chaudhary
我不认为这是一个重复的问题。标题有误导性,但我认为它特别涉及输入的字符串为什么不相同。它也不包含空格,就像其他问题一样。 - tobias_k
1
问题可能会略有不同,但答案是相同的——is在cpython中有时候作为实现细节而巧合地起作用。输入数据并不是特别特殊的事情;应该明确的是永远不要使用is - Wooble
这正是我所期望的。 - Bharat
2个回答

13

is用于检查变量的身份(identity)。当且仅当ab指向同一个对象(它们在同一内存地址中)时,a is bTrue

==用于检查变量的相等性(equality),它通常由魔法方法__eq__定义。即a == bTrue,如果a.__eq__(b)True

在你的特定情况下,Python将两个硬编码字符串优化为同一个对象(因为字符串是不可变的,这并不危险)。由于input()会在运行时创建一个新的字符串对象,所以无法进行此优化,因此会创建一个新的字符串对象。


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

3

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

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


我喜欢“它永远不会 ”。 - Derek Eden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接