即使在手动gc收集后,Weakref也没有在REPL中被删除

时间:2017-09-12 05:03:09

标签: python

我在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,但为什么我仍然会看到这一点。

1 个答案:

答案 0 :(得分:0)

看起来你正在使用IPython。如the docs中所述,IPython将每个输出存储在带编号的全局变量中。因此,存在一个全局变量_72,其中包含对dict(w)Out[72]中输出的值)的引用,这当然包含对以前称为{{的对象的强烈反对。 1}}。