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

Why isn't my WeakSet empty after deleting the only other reference?

我决定让自己熟悉 weakref 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)

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

>>>  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() 实例将不再有 "strong references",它们将是收集的垃圾。但由于某种原因,这不会发生。

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

为什么我的 WeakSet 里面还有一个 weakref?我可以再次使用 del,它仍然存在,似乎无论我做什么。

您仍然有来自此处的 obj 变量:

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

该变量保留其在循环中的最后一个值,因此它仍然引用最后一个 Greek 实例,使其保持活动状态并在 WeakSet.