我刚刚发现了答案。
原因是特殊变量_
仍包含上一次评估的结果。
我有以下Python程序:
import weakref
class NumberWord:
def __init__(self, word):
self.word = word
def __repr__(self):
return self.word
dict = weakref.WeakValueDictionary()
print(f"[A] {len(dict)}")
print(f"dict.get(0) = {dict.get(0)}")
print(f"dict.get(1) = {dict.get(1)}")
list = []
list.append(NumberWord("zero"))
dict[0] = list[0]
print(f"[B] {len(dict)}")
print(f"dict.get(0) = {dict.get(0)}")
print(f"dict.get(1) = {dict.get(1)}")
list.append(NumberWord("one"))
dict[1] = list[1]
print(list)
print(f"[C] {len(dict)}")
print(f"dict.get(0) = {dict.get(0)}")
print(f"dict.get(1) = {dict.get(1)}")
list.pop()
print(list)
print(f"[D] {len(dict)}")
print(f"dict.get(0) = {dict.get(0)}")
print(f"dict.get(1) = {dict.get(1)}")
list.pop()
print(list)
print(f"[E] {len(dict)}")
print(f"dict.get(0) = {dict.get(0)}")
print(f"dict.get(1) = {dict.get(1)}")
我期望以下行为:
在步骤[A],词典为空
在步骤[B],字典包含dict[0] = NumberWord("zero")
在步骤[C]中,字典包含dict[0] = NumberWord("zero")
和dict[1] = NumberWord("one")
在步骤[D]中,字典包含dict[1] = NumberWord("one")
(由于列表中唯一的强引用消失了,因此删除了“零”)]] >>
在步骤[E],字典再次为空(删除了“一个”,因为列表中唯一的强引用消失了)]]
一切都按预期工作例外
步骤[E]:“ [一个]不会不是”消失。为什么不呢?这里是实际输出:
>>> import weakref >>> >>> class NumberWord: ... def __init__(self, word): ... self.word = word ... def __repr__(self): ... return self.word ... >>> dict = weakref.WeakValueDictionary() >>> >>> print(f"[A] {len(dict)}") [A] 0 >>> print(f"dict.get(0) = {dict.get(0)}") dict.get(0) = None >>> print(f"dict.get(1) = {dict.get(1)}") dict.get(1) = None >>> >>> list = [] >>> list.append(NumberWord("zero")) >>> dict[0] = list[0] >>> >>> print(f"[B] {len(dict)}") [B] 1 >>> print(f"dict.get(0) = {dict.get(0)}") dict.get(0) = zero >>> print(f"dict.get(1) = {dict.get(1)}") dict.get(1) = None >>> >>> list.append(NumberWord("one")) >>> dict[1] = list[1] >>> print(list) [zero, one] >>> >>> print(f"[C] {len(dict)}") [C] 2 >>> print(f"dict.get(0) = {dict.get(0)}") dict.get(0) = zero >>> print(f"dict.get(1) = {dict.get(1)}") dict.get(1) = one >>> >>> list.pop() one >>> print(list) [zero] >>> >>> print(f"[D] {len(dict)}") [D] 2 >>> print(f"dict.get(0) = {dict.get(0)}") dict.get(0) = zero >>> print(f"dict.get(1) = {dict.get(1)}") dict.get(1) = one >>> >>> list.pop() zero >>> print(list) [] >>> >>> print(f"[E] {len(dict)}") [E] 1 >>> print(f"dict.get(0) = {dict.get(0)}") dict.get(0) = zero >>> print(f"dict.get(1) = {dict.get(1)}") dict.get(1) = None >>> >>>
我有以下Python程序:importweakref类NumberWord:def __init __(self,word):self.word =单词def __repr __(self):返回self.word dict = weakref.WeakValueDictionary()...
] >我刚刚发现了答案。
原因是特殊变量
_
仍包含上一次评估的结果。[上次评估为
list.pop()
,其结果为NumberWord("zero")
。只要此结果仍存储在
_
中,我们将继续拥有强引用,而弱引用不会消失。我们可以通过进行另一次评估来确认该理论。此时,
_
将包含一个不同的值,并且弱引用将消失:如果我们在以上示例的末尾执行以下附加语句:
_ 5 + 5 _ print(f"[F] {len(dict)}") print(f"dict.get(0) = {dict.get(0)}") print(f"dict.get(1) = {dict.get(1)}")
然后我们得到以下输出:
>>> _ zero >>> 5 + 5 10 >>> _ 10 >>> print(f"[F] {len(dict)}") [F] 0 >>> print(f"dict.get(0) = {dict.get(0)}") dict.get(0) = None >>> print(f"dict.get(1) = {dict.get(1)}") dict.get(1) = None
我刚刚发现了答案。
原因是特殊变量_
仍包含上一次评估的结果。