Python中"is"和"=="有什么区别?

5

1
重复的问题:https://dev59.com/dHI_5IYBdhLWcg3wJfkM#1504742,还有许多其他问题。 - SilentGhost
抱歉,当我发出请求时,它没有在列表中显示-可以关闭这个请求。 - Matthew
2个回答

13
不,它们并不相同。 is 用于检查对象标识 - 即检查 ab 是否完全是同一个对象。例如:
a = 100.5
a is 100.5  # => False
a == 100.5  # => True

a = [1,2,3]
b = [1,2,3]
a == b  # => True
a is b  # => False
a = b
a == b  # => True
a is b  # => True, because if we change a, b changes too.
所以: 如果你的意思是对象应该代表相同的东西(最常见的用法),就使用==,如果你的意思是对象应该在相同的内存块中(如果需要后者,你会知道的),就使用is
此外,你可以通过__eq__运算符重载==,但你不能重载is

3
Java没有is这个关键字,因此很难确定它的确切反义词是什么。 - Pavel Minaev
在Java中,==测试内存地址。 - hasen
1
回答不错,但没有回答关于 a is 1 返回 true 的部分。 - hasen
2
是的,那是事后编辑。这取决于解释器,并反映了小整数被缓存以提高速度的事实。因此,等于1的东西出于性能原因将指向相同的地址。但是你不能依赖这一点。 - Peter
@Jeremy,在Java中,a = [1,2,3]不是有效的代码。 - hasen
显示剩余2条评论

5

如上所述,

is:用于身份测试(相同的“对象”)

==:用于相等性测试(~~相同的值)

还要注意的是,Python使用字符串插入(作为优化),因此您可能会遇到以下奇怪的副作用:

>>> a = "test"
>>> b = "test"
>>> a is b
True
>>> "test_string" is "test" + "_" + "string"
True

>>> a = 5; b = 6; c = 5; d = a
>>> d is a
True  # --> expected
>>> b is a
False # --> expected
>>> c is a
True  # --> unexpected

对于数字,它仅适用于占用一个字节的整数(例如 <= 256)。 - hasen
对于字符串而言,它不会神奇地“检测”相似的字符串。考虑以下代码:>>> a = "test" >>> b = "test" >>> a is b True >>> a = "test_string" >>> c = b + "_string" >>> a == c True >>> a is c False - hasen
2
这是由于字符串/整数的长度,且与解释器相关:不要依赖这种行为。 - Peter

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