我应该担心Python中的循环引用吗?

bod*_*ydo 39 python

假设我有维护父/子结构的代码.在这样的结构中,我得到循环引用,其中一个孩子指向一个父母,一个父母指向一个孩子.我应该担心吗?我正在使用Python 2.5.

我担心它们不会被垃圾收集,应用程序最终会占用所有内存.

Ale*_*lli 32

"担心"是错误的,但是如果你的程序变得很慢,消耗的内存比预期的多,或者有奇怪的莫名其妙的停顿,原因确实可能是那些垃圾引用循环 - 它们需要被垃圾收集与"普通"(非循环)参考图不同的过程,并且该集合是偶然的,如果你在这样的循环中绑定了很多对象,可能会很慢(如果循环中的对象有一个循环垃圾收集也会被禁止)__del__特殊方法).

因此,引用循环不会影响程序的正确性,但可能会影响其性能和/或占用空间.

如果您想要删除不需要的引用循环,您通常可以在Python的标准库中使用weakref模块.

如果您想要进行更多关于循环垃圾收集的直接控制(或执行调试,看看到底发生了什么),请使用Python标准库中的gc模块.


cob*_*bal 18

实验:你很好:

import itertools

for i in itertools.count():
    a = {}
    b = {"a":a}
    a["b"] = b
Run Code Online (Sandbox Code Playgroud)

它一直使用3.6 MB的RAM.

  • 凉!然后我很安全.:) (2认同)

Ned*_*der 11

当没有外部引用时,Python将检测周期并释放内存.

  • 当然假设没有`__del__`方法。通常不应该有,但你永远不知道。有一段时间,由于某种原因,甚至“collections.OrderedDict”也有一个。 (2认同)

Col*_*lin 7

循环引用是正常的事情,所以我没有理由担心它们.许多树算法要求每个节点都有到其子节点及其父节点的链接.他们还需要实现类似双向链表的东西.