【问题标题】:Why two individually created immutable objects have same id and mutable objects have different while both refer to same values? [duplicate]为什么两个单独创建的不可变对象具有相同的 id 而可变对象具有不同的 ID,而两者都引用相同的值? [复制]
【发布时间】:2014-02-01 05:10:05
【问题描述】:

两个单独创建的可变列表具有不同的 id。

Python SHELL:(可变)

>>> mylist = ['spam', 'eggs']
>>> yourlist = ['spam', 'eggs']
>>> id(mylist), id(yourlist)
(49624456, 48910408)

虽然两个单独创建的不可变字符串具有相似的 id。

Python SHELL:(不可变)

>>> a = 10
>>> b = 10
>>> id(a), id(b)
(507099072, 507099072)

ab 是否引用同一个对象?如果不是,为什么 id 相似? mylistyourlist 是指不同的对象吗?如果是,为什么他们有不同的 id。

【问题讨论】:

  • 可变对象可能因此而发生变异,列表被创建了两次,但是如果您检查两个列表的元素 0 的 id,它们应该是相同的。由于列表是可变的,即使列表中的每个“单元格”都指向相同的“不可变”对象,您也不能期望列表指向同一个对象。不可变对象因此不能变异,python可以对其进行优化并防止重复。

标签: python immutability identifier concept mutability


【解决方案1】:

Python 缓存了一些小字符串和数字:http://docs.python.org/2/c-api/int.html#PyInt_FromLong

当前的实现为所有人保留一个整数对象数组 -5 到 256 之间的整数,当您在该范围内创建一个 int 时,您 实际上只是取回对现有对象的引用。

id(some_list) 总是给你容器的地址 - 列出内存中的对象,而不是列表中的字符串!

【讨论】:

  • 有没有办法创建两个在 -5 和 256 之间具有相同值但将它们作为不同对象的变量? a = 2b = 2,然后a is b 将返回True。有没有办法让两者的值都为 2 但不同的对象?
  • @JesseZhuang 我只看到一种方式——通过 int 子类化。您自己的整数类的所有实例都将是不同的对象...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
相关资源
最近更新 更多