首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >python中的引用循环是什么?

python中的引用循环是什么?
EN

Stack Overflow用户
提问于 2012-03-28 23:26:47
回答 4查看 11K关注 0票数 30

我在python的官方文档中查找过,但我似乎找不到什么是引用循环。有没有人可以澄清一下这对我来说是什么,因为我正在试着理解GC模块。提前感谢您的回复。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-28 23:30:27

引用循环只是指一个或多个对象相互引用,这样,如果您在纸上绘制它,并用箭头表示依赖项,您将看到一个循环。

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

代码语言:javascript
复制
a.other = b
b.some_attr = a

Naive垃圾收集器的工作方式严格取决于一个对象是否被另一个对象引用。在这种情况下,如果ab都没有被其他任何东西引用,它们仍然相互引用,幼稚的垃圾收集器可能不会回收内存。(不过,我不知道Python是否会被引用周期所困。)

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

代码语言:javascript
复制
a = []
a.append(a)
票数 29
EN

Stack Overflow用户

发布于 2012-03-28 23:29:56

这是一个参考周期:

代码语言:javascript
复制
l = []
l.append(l)

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

票数 15
EN

Stack Overflow用户

发布于 2013-01-22 14:16:24

代码语言:javascript
复制
>>> aRef = []
>>> aRef.append(aRef)
>>> print aRef
[[...]]

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

代码语言:javascript
复制
>>> import gc
>>> gc.collect()
0
>>> del aRef
>>> gc.collect()
1
>>> gc.collect()
0
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9910774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档