python 引用计数
《Python基础参考手册》第四版提到:
a = {}
b = {}
a['b'] = b
b['a'] = a
del a
del b
这会造成内存泄漏,解释器需要一个循环检测算法来删除变量a和b。不过,当我试着计算引用计数时,发现最后a和b的引用计数都变成了零,所以不需要循环检测算法。比如:
a = {}
b = {}
引用计数:a = 1, b = 1
a['b'] = b
b['a'] = a
引用计数:a = 2, b = 2
del a
引用计数:b['a'] = 1, b = 1
del b
引用计数:a = 0, b = 0
我对引用计数的理解有什么问题吗?
2 个回答
3
Python已经有循环垃圾回收功能一段时间了(从2.3版本开始)。不过,你可以导入gc模块来调整这个循环垃圾回收的设置,包括可以选择关闭它。
4
del a
并不会销毁变量 a
指向的对象,它只是把变量 a
从当前的命名空间中移除了。移除之后,那个字典对象依然存在(因为还有其他字典在引用它),所以它仍然可以被 b
这个字典引用。同样,del b
也不会让第一个字典的引用计数变为零,因为只要它还活着,就会引用第二个字典,这样第二个字典也无法被删除,两个字典就这样相互依赖着。抱歉如果这样说让你感到困惑,我也不太确定该怎么解释。
最终,它看起来是这样的(粗大的框是对象,箭头是引用):
┌──────────┐ ┌──────────┐
│ dict 1 │ │ dict 2 │
│ │ ◀──┤ key 'a' │
│ key 'b' ├──▶ │ │
└──────────┘ └──────────┘