如果列表实现为动态数组,每次分配的大小被完全占用时如果为数组创建新空间,为什么 id 没有改变?
>>> a=[]
>>> id(a)
4395087184
>>> for i in range(1000):
a.append(i)
>>> id(a)
4395087184
最佳答案
对象的id
保证在对象的生命周期内保持不变。因此,如果此列表的 id
更改,则会违反 id
函数的规范,并且您只创建了一个列表,因此不存在两个具有不同 id 的列表对象
s。
实际工作方式是列表对象本身保留在相同的内存位置,但它保存对后备数组的(私有(private))引用。当数组的容量需要更改时,将创建一个新的后备数组并复制内容。列表对象的(私有(private))引用已更新为指向新的支持数组,但列表对象本身尚未在内存中重新定位。
我写了a longer explanation其工作原理,包括一个交互式示例,其中显示了列表对象和支持数组的盒指针图。您可能会发现这有助于了解调整后备数组大小时内存中实际发生的情况。
关于python-3.x - 如果Python列表是作为动态数组实现的,为什么追加操作后其id没有改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58753048/