为什么在删除唯一的其他引用后我的 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 weakref
s,它确实:
>>> 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
.
中
我决定让自己熟悉 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 weakref
s,它确实:
>>> 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
.