3

所以 Python 基本参考,第 4 版。说:

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

我对引用计数的理解有什么问题?

4

2 回答 2

4

del a不会破坏变量指向的对象,它只会从当前命名空间a中删除变量。a在此之后, dict 继续存在(因为另一个 dict 仍然引用它),因此仍然引用第二个 dict b。同样,del b不会导致第一个 dict 的 refcount 达到零,因为只要它还活着,它就会引用第二个 dict,因此也不能删除一个并保持另一个活着。抱歉,这听起来令人困惑,我不太确定如何表达。

最后,它看起来像这样(大盒子是对象,箭头是引用):

 ┌──────────┐    ┌──────────┐
 │  dict 1  │    │  dict 2  │
 │          │ ◀──┤  key 'a' │
 │  key 'b' ├──▶ │          │
 └──────────┘    └──────────┘
于 2010-12-11T12:12:31.460 回答
3

Python 循环 gc 已经有一段时间了(从 2.3 开始)。但是,可以导入 gc 模块并调整循环 gc - 包括禁用它的可能性。

于 2010-12-11T12:12:41.727 回答