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