我已经查看了Python官方文档,但似乎找不到什么是引用循环。有人能为我澄清一下吗?因为我正在尝试理解GC模块。提前感谢您的回复。
我无法找到“引用循环”的定义。请问这个术语是什么意思?我已经查看了Python官方文档,但似乎找不到什么是引用循环。有人能为我澄清一下吗?因为我正在尝试理解GC模块。提前感谢您的回复。
我无法找到“引用循环”的定义。请问这个术语是什么意思?引用循环指的是一个或多个对象彼此引用,如果你在纸上用箭头代表依赖关系画出来,你会看到一个循环。
(几乎)最简单的引用循环是两个互相引用的对象 a
和 b
:
a.other = b
b.some_attr = a
简单的垃圾收集器只根据一个对象是否被另一个对象引用来工作。在这种情况下,如果a
和b
都没有被其他任何东西所引用,它们仍然相互引用,一个简单的垃圾收集器可能无法回收内存。(我不知道Python是否会被引用循环困住。)
编辑:最简单的引用循环是一个指向自身的对象:
a = []
a.append(a)
这是一个引用循环:
l = []
l.append(l)
l
的第一个元素,即 l[0]
,现在是对 l
自身的循环引用。
>>> aRef = []
>>> aRef.append(aRef)
>>> print aRef
[[...]]
这将创建一个名为aRef
的变量所引用的列表对象。列表对象中的第一个元素
是对自身的引用。在这种情况下,del aRef
将aRef
从列表对象中解除引用。然而,列表对象的引用计数并没有减少到零,也没有被垃圾收集器回收,因为列表对象仍然引用着它自己。在这种情况下,Python的垃圾收集器会定期检查是否存在这样的循环引用,并由解释器进行收集。以下是手动收集循环引用对象所占用空间的示例。
>>> import gc
>>> gc.collect()
0
>>> del aRef
>>> gc.collect()
1
>>> gc.collect()
0
>>> x=[1,2,3]
>>> x.append(x)
>>> x
[1, 2, 3, [...]]
>>>
x
正在引用自身,这就被称为引用循环。