如何理解Python中list结构的内存占用规则?附测试案例相关疑问
Python列表内存占用问题解答
首先明确两个核心逻辑:
sys.getsizeof()仅统计列表容器本身的内存占用,不会计算列表内存储的各元素对象自身的内存大小,因此列表内存占用和元素类型无关,只和列表预分配的指针槽位总数有关(64位系统下每个元素指针占8字节,槽位越多列表内存越大)- CPython的列表底层是动态数组实现,为了避免每次新增元素都重新申请内存、提升操作性能,采用超额预分配的机制:每次扩容时会多申请一部分备用槽位,只要实际存储的元素数量没超过预分配的槽位总上限,新增元素就不会触发扩容,列表本身的内存占用也不会变化。
问题1解答:为什么list6的内存占用比list7大,却和list9相等?
list6虽然实际只存储了6个元素,但它的预分配槽位总数比存储7个元素的list7、8个元素的list8都要高,和存储9个元素的list9的预分配槽位总数一致,因此内存占用和list9相等、比list7更大。
这种差异通常和列表的创建逻辑有关:如果list6是先写入了更多元素再删除多余元素,列表的预分配槽位不会自动回收,就会出现实际元素少但内存占用更高的情况。
问题2解答:为什么list3到list5的内存占用,与list7到list8的内存占用相等?
在你的测试环境中,这几个列表初始化后的预分配槽位总上限都是8个:
- list3(3个元素)、list4(4个元素)、list5(5个元素)的元素数都未超过8
- list7(7个元素)、list8(8个元素)的元素数也未超过8
所有列表都没有达到需要触发扩容的阈值,因此内存占用保持一致。如果给list8再新增1个元素变成9个,就会触发扩容,内存占用会上涨到和list9一致的152字节。
内容的提问来源于stack exchange,提问作者pythonnoob
相关产品推荐
相关产品推荐

