python中的参考周期是什么?

时间:2012-03-28 15:26:47

标签: python garbage-collection reference-counting cyclic-reference

我查看了python的官方文档,但我似乎无法找到参考周期。任何人都可以澄清它对我来说是什么,因为我想了解GC模块。提前感谢您的回复。

4 个答案:

答案 0 :(得分:21)

引用循环只是意味着一个或多个对象相互引用,这样如果你用纸上画出代表依赖关系的箭头,你会看到一个循环。

(几乎)最简单的参考周期是两个彼此引用的对象ab

a.other = b
b.some_attr = a

朴素垃圾收集器严格依赖于对象是否被另一个对象引用。在这种情况下,如果ab都没有被其他任何东西引用,它们仍然互相引用,而天真的垃圾收集器可能无法回收内存。 (不过我不知道Python是否可以被参考周期捕获。)

编辑:最简单的参考周期是一个引用自身的对象:

a = []
a.append(a)

答案 1 :(得分:11)

这是一个参考周期:

l = []
l.append(l)

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

答案 2 :(得分:9)

>>> 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

答案 3 :(得分:3)

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

现在变量x指的是自身,这称为参考周期。