首页 > 解决方案 > 为什么python列表的id在追加操作后没有改变,如果它被实现为动态数组?

问题描述

如果将列表实现为动态数组,那么每次为数组创建新空间时,分配的大小都被完全占用,为什么id没有变化?

>>> a=[]

>>> id(a)
4395087184

>>> for i in range(1000):
     a.append(i)


>>> id(a)
4395087184

标签: python-3.xlist

解决方案


id对象的保证对象的生命周期内是持久的。因此,如果此列表发生更改,则将违反id函数规范id,并且您只创建了一个列表,因此没有两个具有不同ids 的列表对象。

这在实践中的工作方式是列表对象本身保留在相同的内存位置,但它拥有对支持数组的(私有)引用。当阵列的容量需要更改时,会创建一个新的后备阵列并复制内容。列表对象的(私有)引用已更新为指向新的后备数组,但列表对象本身并未在内存中重新定位。

我已经写了一个更长的解释它是如何工作的,包括一个显示列表对象和支持数组的框和指针图的交互式示例。您可能会发现这有助于了解调整后备数组大小时内存中实际发生的情况。


推荐阅读