为什么即使列表在内存中移动,列表的 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 - 这是每种语言所必需的。
据我所知,动态数组(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 - 这是每种语言所必需的。