我在REPL中执行以下代码时也看到了这个问题,即使在手动执行gc.collect()
之后我仍然可以看到weakref对象。见下文
[67]: from weakref import WeakValueDictionary
class A:
def __init__(self):
self.val = 1
a = A()
w = WeakValueDictionary()
w['k1'] = a
dict(w)
Out[72]: {'k1': <__main__.A at 0x1e59e9b84a8>}
del a
gc.collect()
Out[74]: 239
dict(w)
Out[75]: {'k1': <__main__.A at 0x1e59e9b84a8>}
理想情况下,一旦删除了强参考并且手动gc已经完成,就应该清除weakref,但为什么我仍然会看到这一点。
答案 0 :(得分:0)
看起来你正在使用IPython。如the docs中所述,IPython将每个输出存储在带编号的全局变量中。因此,存在一个全局变量_72
,其中包含对dict(w)
(Out[72]
中输出的值)的引用,这当然包含对以前称为{{的对象的强烈反对。 1}}。