python 引用计数

3 投票
2 回答
635 浏览
提问于 2025-04-16 08:23

《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' ├──▶ │          │
 └──────────┘    └──────────┘

撰写回答