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

由于可变,当扩展Python列表时(例如,mylist.extend()或mylist = anotherlist),列表的ID不会更改.我知道(至少在CPython中)列表在内存中是连续的(并且ID恰好是列表头的地址).如果列表后的内存已经高度碎片化并且无法分...

由于可变,当扩展Python列表时(例如,mylist.extend()或mylist = anotherlist),列表的ID不会更改.

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

解决方法:

在CPython中,这是列表和元组分配方式的差异.对于列表,该对象包含一个指向为列表内容分配的内存的指针.适当的列表对象很小,不需要移动.它指向的向量的地址可以更改任何次数.

对于大多数情况下预期较小的元组对象,确实会在元组对象中直接分配用于元组内容的内存.但是元组无法调整大小,因此在这种情况下不会出现您的情况.

本文标题为:如果列表后没有足够的连续内存,CPython处理列表的方式如何扩展?

基础教程推荐