如果增加大小,为什么 python 列表的位置没有改变?

Why the location of python list is not being changed if the size is increased?

据我所知,pythonlist是一个动态数组。所以当我们达到一定大小时,那个列表的容量会自动增加。但问题是,与c或c++的动态数组不同,即使增加列表实例的容量,位置也不会改变。为什么会这样?

我已经使用以下代码块对此进行了测试

l = []

print(l.__sizeof__())
print(id(l))

for i in range(5_000_000):
    l.append(i)

print(l.__sizeof__())
print(id(l))

在CPython中(python.org分发的用C编写的实现),一个Python object在内存中永远不会移动。在列表 object 的情况下,实际上分配了 两个 块内存:所有 variable-size [=20= 通用的基本 header 结构] 容器 objects(包含诸如引用计数、指向类型 object 的指针以及包含的 objects 的数量),以及用于 C-level 向量保存指向包含的 Python object 的指针。 header 结构指向该向量。

该向量可以以任意方式改变大小,header 结构将更改为指向其当前位置,但 header 结构永远不会移动。 id() returns header 结构的地址。 Python 不暴露 objects 向量的地址。