python中的参考周期是什么?

IT *_*nja 24 python garbage-collection reference-counting cyclic-reference

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

Pla*_*ure 22

引用循环只是意味着一个或多个对象相互引用,这样如果您将它绘制在纸上,箭头表示依赖关系,您将看到一个循环.

(几乎)最简单的引用循环是两个对象a并且b相互引用:

a.other = b
b.some_attr = a
Run Code Online (Sandbox Code Playgroud)

朴素垃圾收集器严格地依赖于对象是否被另一个对象引用.在这种情况下,如果ab不被别的称,他们仍然称对方和天真的垃圾收集器可能无法回收内存.(不过我不知道Python是否可以被参考周期困住.)

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

a = []
a.append(a)
Run Code Online (Sandbox Code Playgroud)


Fre*_*Foo 12

这是一个参考周期:

l = []
l.append(l)
Run Code Online (Sandbox Code Playgroud)

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


Ran*_*ngh 9

>>> aRef = []
>>> aRef.append(aRef)
>>> print aRef
[[...]]
Run Code Online (Sandbox Code Playgroud)

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

>>> import gc
>>> gc.collect()
0
>>> del aRef
>>> gc.collect()
1
>>> gc.collect()
0
Run Code Online (Sandbox Code Playgroud)