python引用计数

python引用计数,python,refcounting,Python,Refcounting,因此,《Python基本参考》第4版说: a = {} b = {} a['b'] = b b['a'] = a del a del b 创建内存泄漏,解释器需要周期检测算法来删除a和b。 然而,当我试图计算refcount是如何计算的时候,在我看来,在最后,a和b的refcount都变为零,因此不需要周期检测算法。比如: a = {} b = {} 参考计数:a=1,b=1 a['b'] = b b['a'] = a del b 参考计数:a=2,b=2 del a 参考计数:b['

因此,《Python基本参考》第4版说:

a = {}
b = {}
a['b'] = b
b['a'] = a
del a
del b
创建内存泄漏,解释器需要周期检测算法来删除a和b。 然而,当我试图计算refcount是如何计算的时候,在我看来,在最后,a和b的refcount都变为零,因此不需要周期检测算法。比如:

a = {}
b = {}
参考计数:a=1,b=1

a['b'] = b
b['a'] = a
del b
参考计数:a=2,b=2

del a
参考计数:b['a']=1,b=1

a['b'] = b
b['a'] = a
del b
参考计数:a=0,b=0


我对refcounts的理解有什么问题?

dela
不会破坏变量
a
指向的对象,它只会从当前命名空间中删除变量
a
。在此之后,dict继续存在(因为另一个dict仍然引用它),因此仍然引用第二个dict
b
。类似地,
del b
不会导致第一个dict的refcount达到零,因为只要它处于活动状态,它就会引用第二个dict,因此一个dict也不能被删除,而另一个dict保持活动状态。对不起,这听起来很混乱,我不太清楚该怎么说

最后,它看起来是这样的(笨重的方框是对象,箭头是引用):

+------------++----------+
|第1条| |第2条|
|          |  |          |
+----------+    +----------+

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

在C实现中没有。@Karl:Wat?CPython有一个循环gc。请看@Karl,自从2.3CPython有gc以来,cpython就有了循环gc,但正如gnibbler所说,它只用于循环检测。现在有意义了。我认为关键是要认识到dela只从名称空间中删除变量。