为什么我的WeakSet在删除唯一的其他引用后不是空的?

2024-04-27 15:56:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我决定我应该熟悉^{} library,所以我开始乱搞收藏,以为在这之前我已经掌握了窍门。你知道吗

>>> import weakref

>>> class Greek():
        def __init__(self, name):
            self.name = name

>>> objs = [Greek('alpha'), Greek('gamma'), Greek('zeta')]
>>> weak_s = weakref.WeakSet()

>>> for obj in objs: weak_s.add(obj)

这里我有一个弱集weak_s,我希望每个Greek()实例包含3个weakref,它确实:

>>>  weak_s.data
{<weakref at 0x02ECA690; to 'Greek' at 0x02E5FF90>,
 <weakref at 0x02ECA720; to 'Greek' at 0x02E5FFB0>,
 <weakref at 0x02ECA750; to 'Greek' at 0x02E5FFD0>}

然后我希望,一旦我去掉了objs名称,就不会再有对每个Greek()实例的“强引用”,它们将被垃圾收集。但出于某种原因,这并没有发生。你知道吗

>>> del objs
>>> weak_s.data
{<weakref at 0x02ECA750; to 'Greek' at 0x02E5FFD0>}

为什么我的WeakSet里还有一个weakref?我可以再次使用del,而且它仍然存在,似乎不管我做什么。你知道吗


Tags: to实例nameselfobjdatalibraryat