为什么是() is ()
真的,又(0,) is (0,)
是假的?
我以为他们会是同一个对象。但是,我显然遗漏了一些东西。
is
测试语句的两边是否共享相同的内存地址。它基本上是一个简写形式id(a) == id(b)
>>> print id(()), id(())
30085168 30085168
>>> print id((0,)), id((0,))
38560624 38676432
>>>
正如()
经常发生的那样,它实际上被 Python 解释器视为单例(就像从 0 到 255 的整数、空字符串、空列表等)。与解释器相比(0, )
,(0, )
它们实际上是内存中的不同变量。如果它们是可变的,您可以修改第一个,而第二个不会改变,因此它们不一样(a is not b
)。
is
测试身份,而不是平等。这意味着 Python 只是比较对象所在的内存地址。基本上回答了“我对同一个对象有两个名称吗?”这个问题。
通常 Python 将每个元组写入不同的内存位置,
实习通常只发生在字符串文字中。
正如 Dougal 在他的评论中所说,is
测试您要比较的两件事在内存中的相同位置。对于数字、字符串、布尔值和空元组之类的东西,Python 默认重用对象(实习),因此is
通常会产生与==
. 这也意味着您可以通过比较内存指针而不是更复杂的数据类型(如字符串)来获得一些性能提升。
对于其他事物,例如您的情况下的元组(即使它们是不可变的),或者列表甚至是空列表[]
,Python 将在不同的内存位置创建一个新对象,并且is
不会以相同的方式工作==
如果您尝试按值比较两个元组,==
那将是更好的比较。