Python中的引用循环是什么?

35

我已经查看了Python官方文档,但似乎找不到什么是引用循环。有人能为我澄清一下吗?因为我正在尝试理解GC模块。提前感谢您的回复。

我无法找到“引用循环”的定义。请问这个术语是什么意思?
4个回答

35

引用循环指的是一个或多个对象彼此引用,如果你在纸上用箭头代表依赖关系画出来,你会看到一个循环。

(几乎)最简单的引用循环是两个互相引用的对象 ab

a.other = b
b.some_attr = a

简单的垃圾收集器只根据一个对象是否被另一个对象引用来工作。在这种情况下,如果ab都没有被其他任何东西所引用,它们仍然相互引用,一个简单的垃圾收集器可能无法回收内存。(我不知道Python是否会被引用循环困住。)

编辑:最简单的引用循环是一个指向自身的对象:

a = []
a.append(a)

Python可以检测到引用循环。更准确地说,“在Python 1.5中引入了额外的循环检测算法。gc模块负责处理这个问题,仅存在于处理此类问题时使用。” [https://rushter.com/blog/python-garbage-collector/] - Adam Chalcraft

16

这是一个引用循环:

l = []
l.append(l)

l 的第一个元素,即 l[0],现在是对 l 自身的循环引用。


a = MyClass() a.myproperty = a - fanny

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

这将创建一个名为aRef的变量所引用的列表对象。列表对象中的第一个元素是对自身的引用。在这种情况下,del aRefaRef从列表对象中解除引用。然而,列表对象的引用计数并没有减少到零,也没有被垃圾收集器回收,因为列表对象仍然引用着它自己。在这种情况下,Python的垃圾收集器会定期检查是否存在这样的循环引用,并由解释器进行收集。以下是手动收集循环引用对象所占用空间的示例。

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

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

现在这里变量x正在引用自身,这就被称为引用循环。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接