我有这段代码:
import gc
def hacerciclo():
l=[0]
l[0]=l
recolector=gc.collect()
print("Garbage collector %d" % recolector)
for i in range (10):
hacerciclo()
recolector=gc.collect()
print("Garbage collector %d" % recolector)
这是使用gc.collect()的示例代码。问题是相同的代码在不同的计算机上显示不同的输出。
一台电脑显示: 垃圾收集器1 垃圾收集器10 其他人表示: 垃圾收集器0 垃圾收集器10
为什么会这样?
答案 0 :(得分:3)
当前版本的Python使用引用计数来跟踪分配的内存。 Python中的每个对象都有一个引用计数,指示有多少对象指向它。当此引用计数达到零时,将释放该对象。这适用于大多数程序。然而,引用计数存在一个基本缺陷,这是由于所谓的参考周期。参考周期的最简单示例是一个引用自身的对象。例如:
>>> l = []
>>> l.append(l)
>>> del l
创建的列表的引用计数现在是一个。但是,因为它无法从Python内部到达并且不能再次使用,所以应该将其视为垃圾。在当前版本的Python中,永远不会释放此列表。
创建参考周期通常不是良好的编程习惯,几乎总是可以避免。但是,有时很难避免创建引用周期,有时程序员甚至都没有意识到它正在发生。对于诸如服务器之类的长期运行程序,这尤其麻烦。人们不希望他们的服务器内存不足,因为引用计数无法释放无法访问的对象。对于大型程序,很难找到如何创建参考周期。
来源:http://arctrix.com/nas/python/gc/
以下链接包含您正在使用的示例示例,它还解释了:
http://www.digi.com/wiki/developer/index.php/Python_Garbage_Collection