Python"是"语句和元组

rec*_*gle 12 python comparison tuples

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

我以为他们会是同一个对象.但是,我显然错过了一些东西.

Est*_*ber 12

is测试以查看语句的两端是否共享相同的内存地址.它基本上是一个简写id(a) == id(b)

>>> print id(()), id(())
30085168 30085168
>>> print id((0,)), id((0,))
38560624 38676432
>>>
Run Code Online (Sandbox Code Playgroud)

正如()经常发生的那样,它实际上被Python解释器视为单例(就像0到255之间的整数,空字符串,空列表等).当与解释器进行比较时(0, ),(0, )它们实际上是内存中的不同变量.如果它们是可变的,你可以修改第一个,第二个不会改变,因此它们不是相同的(a is not b).

  • 空名单不是单身人士; 它们是可变的,所以你想要**每次出现`[]`来创建一个新列表!另外,在这样的临时对象上使用`id`时要小心; 在我的系统上输入`(id([]),id([]))`到REPL给出`(48511432L,48511432L)`,但这并不意味着它们是同一个对象; 它只是第一个列表在被"id"后被丢弃为垃圾,然后第二个被分配到内存中这个方便的空列表大小的空洞中,它刚刚被释放.除非确保对象的寿命长于`id`值,否则`id`值可能毫无意义. (9认同)
  • @max 正确,`is` 测试没问题。原因是 `is` 直接测试对象,这意味着它们必须同时处于活动状态,以便您将它们传递给 `is`,因此如果它们',它们不可能意外地具有相同的内存地址'不同的对象。比较 id 的结果会将事物分成多个阶段,这可能会导致第一个对象在获取其 id 之后但在分配第二个对象之前被释放,这可能会导致两个不同的对象被分配到同一地址并具有相同的“id”。 (2认同)

sha*_*pan 5

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

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