当没有更多对象的引用时,GC应该逐渐摆脱它。但是当我们仍然引用对象的属性或方法时会发生什么?
例如,在下面的代码中,即使a.x
被删除,我仍然尝试使用a
。这是一段有效的代码吗?
import gc
class A:
def __init__(self, x):
self.x = x
a = A(7)
x = a.x
del a
gc.collect()
print(x) # is it going to work?
如果我使用方法而不是属性,答案是否会改变?例如:
import gc
class A:
def __init__(self, x):
self.x = x
def method(self):
print("A.method", self.x)
a = A(7)
f = a.method
del a
gc.collect()
f() # is it going to work?
这两段代码都有效。
被任何东西引用都会保护对象不被收集。在大多数情况下包括父对象/类/闭包,因为边界实际上确实“自动”处理引用链