python-3.x - 如果Python列表是作为动态数组实现的,为什么追加操作后其id没有改变?

标签 python-3.x list

如果列表实现为动态数组,每次分配的大小被完全占用时如果为数组创建新空间,为什么 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/

相关文章:

c++ - std::list 的 erase 成员函数是否为所有存储的元素调用析构函数?

python - 从 Pandas 数据框构建二维数组

python - 无参数输入的函数可变范围

python - 按首选顺序对列表进行排序

python - 计算机之间的套接字

python - 如何附加到深度嵌套在字典中的列表并保留嵌套结构?

java - 扩展 ArrayList 并使用/创建类似的构造函数

Java:如何初始化一个固定长度的List of List?

python - func (1) 返回的数组与 Python 中的大小不匹配

python - 使用python将字符附加到txt文件中的每一行