【问题标题】:How to tell when 2 variables with same value will have different identities? [duplicate]如何判断 2 个具有相同值的变量何时具有不同的身份? [复制]
【发布时间】:2013-06-12 09:01:28
【问题描述】:
>>> x = [1,2,3]
>>> y = [1,2,3]
>>> print id(x),id(y)
43259384 43258744

>>> x = 1
>>> y = 1
>>> print id(x),id(y)
5417464 5417464

如您所见,第一次打印的 ID 不同,但第二次打印的 ID 相同。为什么?是什么决定了 2 个变量的 ID 在被赋予相同的值后是否相同?

【问题讨论】:

  • @IgnacioVazquez-Abrams 这个问题是关于列表的,它不应该有相同的id。链接没有解释这个问题的全部内容
  • 数字是不可变的。因此,Python 实现可能利用实习(如相关文章中的答案中所述)-Java 对一组有限的整数做同样的事情。其他语言实现(即 ELisp 和 MRI Ruby)使用“立即值”作为另一种优化,在比较身份时具有相同的结果。
  • @jamylak 列表没有相同的 id。
  • @user2246674 只是将其发布为答案而不是评论;)

标签: python memory


【解决方案1】:

小整数被拘禁

具有小值的短整数(通常在 -1 到 99 之间) inclusive) 是“interned”——只要结果有这样的值, 返回具有相同值的现有 short int。这是 未完成对于具有相同值的长整数。

进一步,

但可能存在使用“is”比较短整数和 正好因为这次实习而工作。这样的代码可能会失败 如果与长整数一起使用。)

但是,这种不是行为应该被依赖,因为它是特定于实现的。它不适用于更大的整数并且不能保证实习,所以你不应该在这里使用is。 除了整数,字符串也可以被intern。

(PEP-0237)

【讨论】:

  • 在 CPython 上,范围是 -5 到 256。
【解决方案2】:

正如@jamylak 指出的那样,您的第一个测试比较两个列表的id,而不是它们包含的整数。如果你实际比较列表中的整数——例如print id(x[0]), id(y[0])——你可能会得到相同的id

>>> x = [1, 2, 3]
>>> y = [1, 2, 3]
>>> print id(x[0]), id(y[0])
4298179016 4298179016

【讨论】:

  • 这是真的,因为@Ignacio 的链接中显示了实习,但我更强调列表是可变的这一事实。
  • 明白了。感谢您的澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 2022-01-11
  • 2021-09-15
相关资源
最近更新 更多