如果列表后没有足够的连续内存,CPython 如何处理列表扩展?

Mar*_*ver 5 python list append extend

由于是可变的,当 Pythonlist被扩展时(例如mylist.extend()mylist += anotherlist),列表的 id 不会改变。

我知道(至少在 CPython 中)列表在内存中是连续的(并且 id 恰好是列表头的地址)。如果列表后面的内存已经高度碎片化并且无法分配列表扩展(即使有足够的可用空间,尽管该区域不连续)怎么办?分配失败?如何缓解这种情况?

Tim*_*ers 2

在 CPython 中,这是列表和元组分配方式的差异。对于列表,该对象包含指向列表内容分配的内存的指针。列表对象本身很小,并且永远不需要移动;它指向的向量的地址可以改变任意多次。

对于大多数时候预计会很小的元组对象来说,元组内容的内存确实是直接在元组对象中分配的。但元组无法调整大小,因此在这种情况下不会出现您的场景。