当不再有对对象的引用时,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?
答案 0 :(得分:1)
这两个代码段都可以工作。
被任何东西引用都可以防止对象被收集。在大多数情况下,都包括父对象/类/闭包,因为绑定实际上确实会“自动”处理引用链。