12

为什么是() is ()真的,又(0,) is (0,)是假的?

我以为他们会是同一个对象。但是,我显然遗漏了一些东西。

4

3 回答 3

12

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)。

于 2012-04-04T04:52:03.517 回答
5

is测试身份,而不是平等。这意味着 Python 只是比较对象所在的内存地址。基本上回答了“我对同一个对象有两个名称吗?”这个问题。

通常 Python 将每个元组写入不同的内存位置,
实习通常只发生在字符串文字中。

于 2012-04-04T04:45:11.493 回答
3

正如 Dougal 在他的评论中所说,is测试您要比较的两件事在内存中的相同位置。对于数字、字符串、布尔值和空元组之类的东西,Python 默认重用对象(实习),因此is通常会产生与==. 这也意味着您可以通过比较内存指针而不是更复杂的数据类型(如字符串)来获得一些性能提升。

对于其他事物,例如您的情况下的元组(即使它们是不可变的),或者列表甚至是空列表[],Python 将在不同的内存位置创建一个新对象,并且is不会以相同的方式工作==

如果您尝试按值比较两个元组,==那将是更好的比较。

于 2012-04-04T05:04:31.283 回答