Python内存利用与垃圾回收器工作机制——整数内存复用疑问
Python整数不可变对象的垃圾回收与内存复用解析
我们知道Python中的整数(int)是不可变对象,无法在不改变引用的前提下就地修改其值。通过以下场景可以直观理解Python垃圾回收器的工作机制:
from ctypes import c_long a = 1000 while a < 1010: print(id(a), c_long.from_address(id(a))) a = a + 1
运行上述代码后,输出结果如下:
140548768404176 c_long(1) 140548768406160 c_long(1) 140548768404176 c_long(1) 140548768406160 c_long(1) 140548768404176 c_long(1) 140548768406160 c_long(1) 140548768404176 c_long(1) 140548768406160 c_long(1) 140548768404176 c_long(1) 140548768406160 c_long(1)
关键说明
c_long.from_address(id())用于获取目标对象的引用计数。我们清楚:当变量被重新赋值后,旧对象的引用计数若降至0,垃圾回收机制会立即释放该对象占用的内存,这块内存可被后续分配新对象时复用。
为什么仅两块内存被反复复用?
原因可以拆解为两点:
- 小对象内存的即时回收:对于大于256的整数(不在Python的小整数常驻池内),每次执行
a = a + 1时,会生成一个新的整数对象,同时旧对象的引用计数直接减1。当旧对象的引用计数变为0时,Python的私有内存分配器会立刻回收这块内存(无需等待全局垃圾回收周期,小对象内存由内存池直接管理)。 - 内存块的循环复用策略:看具体执行流程:
- 初始
a=1000,该对象仅被a引用,引用计数为1; - 第一次循环打印后,
a = a+1创建1001,此时1000的引用计数降至0,内存被释放; - 第二次循环打印1001后,
a = a+1创建1002,1001的引用计数降至0,内存被释放; - 创建1003时,内存分配器优先复用最早释放的1000的内存块;创建1004时,复用1001的内存块,以此循环。
- 初始
正是因为当前循环每次只释放一个旧对象、创建一个新对象,加上内存分配器对最近释放的小内存块的循环复用策略,才出现了两块内存交替被重复使用的现象。
内容的提问来源于stack exchange,提问作者Hetvee Shah
相关产品推荐
相关产品推荐

