假设我有维护父/子结构的代码.在这样的结构中,我得到循环引用,其中一个孩子指向一个父母,一个父母指向一个孩子.我应该担心吗?我正在使用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.
Ned*_*der 11
当没有外部引用时,Python将检测周期并释放内存.