为什么即使列表在内存中移动,列表的 id 也不会改变?

Why doesn't the id of a list change even if the list is moved in memory?

据我所知,动态数组(Python 中的列表)在其大小达到其容量时在内存中移动。据我所知,一个对象的id对应于它的内存地址。

但是当多次向列表添加值时,它的 id 不会改变(因此它在内存中保持在同一个位置)。

为什么?

a = []

print(id(a))  # 2539296050560

for i in range(1_000_000):
    a.append(i)

print(id(a))  # 2539296050560

您混淆了列表的地址(CPython 中的 id 是什么)和 data 的地址.在幕后和 CPython 中,列表是一个包含指向其数据开头的指针的对象。因此,当您扩展列表时,数据将在内存中移动,但列表对象不会移动,从而允许它保留固定 ID - 这是每种语言所必需的。