python 列表底层是动态数组,扩容时按“增长因子 + 阈值修正”策略预分配空间;触发条件是元素数量等于底层数组长度;初始容量为 0,首次 append 后设为 1,后续扩容近似为 new_size = old_size + old_size // 8 + (old_size
Python 列表底层是动态数组,扩容时不是每次加 1 个元素,而是按特定策略预分配额外空间,减少频繁内存分配开销。
扩容触发条件
当执行 append() 或 insert() 等操作导致当前容量不足时,列表会自动扩容。核心判断依据是:当前元素数量等于已分配的底层数组长度。
扩容倍数策略(CPython 实现)
CPython 中列表扩容采用“增长因子 + 阈值修正”方式,不是固定 2 倍:
- 初始容量为 0,首次 append 后设为 1
- 后续扩容公式近似为:new_size = old_size + old_size // 8 + (old_size
- 实际增长比例在 1.125 倍左右浮动,小容量时增幅略大,大容量时更平缓
- 例如:从 64→72(+8),1024→1136(+112),并非简单翻倍
内存复用与缩容逻辑
列表 不会因 pop()或 del 操作自动缩容,已分配的内存保持不变,避免反复伸缩开销。只有调用 list.clear() 或重新赋值时才可能释放内存。若需主动释放,可用 del list[:] 后重建,但通常不必要。
影响与优化建议
了解扩容机制有助于写出更高效的代码:
- 预先知道大致长度时,用 [None] * n 初始化,比循环 append 快
- 批量添加用 extend() 比多次 append 更优,它会一次性预估所需空间
- 避免在循环中对大列表频繁 insert(0, x),这会引发大量元素移动和潜在扩容
- 可通过 sys.getsizeof(lst) 查看当前内存占用,辅助分析
动态数组的设计在时间与空间之间做了合理权衡,既保证平均 O(1)的追加效率,又控制内存浪费在可接受范围。































