如果我这样做:
def foo():
a = SomeObject()
离开foo后,'a'是否被立即销毁?还是等待一些GC发生?
答案 0 :(得分:18)
是和否。离开foo后对象将被销毁(只要没有其他内容可以引用它),但是它是否是立即的是一个实现细节,并且会有所不同。
在CPython(标准python实现)中,使用了引用计数,因此该项将立即被销毁。这有一些例外,例如当对象包含循环引用时,或者引用被保持到封闭框架时(例如,引发了保留对框架变量的引用的异常。)
然而,在Jython或IronPython之类的实施例中,在垃圾收集器启动之前,该对象将无法完成。
因此,您不应该依赖于及时完成对象,而应该只假设它会在最后一次引用之后的某个时刻被销毁。当您确实需要根据词法范围进行一些清理时,要么明确地调用清理方法,要么查看python 2.6中的新with statement(2.5中带有“from __future__ import with_statement
”)。 / p>