16

我已经看过python的官方文档,但我似乎无法找到什么是参考周期。任何人都可以澄清它是什么,因为我想了解GC模块。预先感谢您的回复。python中的引用循环是什么?

回答

15

引用循环只是指一个或多个引用对象的对象,例如,如果使用代表依赖关系的箭头将其绘制在纸张上,您将看到一个循环。

的(几乎)最简单的参考周期具有两个对象ab引用对方:

a.other = b 
b.some_attr = a 

朴素的垃圾收集器严格工作过的物体是否被另一对象引用。在这种情况下,如果ab都未被别的引用,它们仍然互相引用,并且幼稚的垃圾回收器可能不会回收内存。 (我不知道是否Python可以通过参考周期或困不,虽然)。

编辑:最简单的参考周期是指本身的对象:

a = [] 
a.append(a) 
10

这是一个参考周期:

l = [] 
l.append(l) 

l第一元件,即l[0],是现在l本身环状参考。

3
>>> x=[1,2,3] 
>>> x.append(x) 
>>> x 
[1, 2, 3, [...]] 
>>> 

现在这里变量x是指自身,这被称为参考循环。

7
>>> aRef = [] 
>>> aRef.append(aRef) 
>>> print aRef 
[[...]] 

这会创建一个名为aRef的变量所引用的列表对象。列表对象中的first element是对其自身的引用。在这种情况下,del aRef解除引用aRef到列表对象。但是,列表对象的引用计数不会减少到零,并且列表对象不会被垃圾收集,因为列表对象仍然引用自身。在这种情况下,Python中的垃圾收集器将定期检查是否存在这样的循环引用,并且解释器将收集它们。以下是手动收集循环引用对象所用空间的示例。

>>> import gc 
>>> gc.collect() 
0 
>>> del aRef 
>>> gc.collect() 
1 
>>> gc.collect() 
0