这是一个复杂的问题设置,但我会尽力解释。我的情况是我有两个词典dict1
和dict2
。 dict1
包含两个词典中的每个项目,但它保留实际对象(而不是对象的引用)。另一个重要因素是dict1
将所有项目存储在一个字典中;本身。
dict2
被划分为子区域,每个子区域包含dict1
中的一个或多个项目,使dict1
中的所有对象也位于{dict2
的子区域的交集中。 1}}并且没有重复。现在的问题是,我想对dict2
的子条款中的项目进行弱引用,以便在从dict1
删除该项目时,它的参考也是如此在dict2
。
例如:
>>> import weakref
>>> dict1 = {}
>>> dict2 = {'subdict': {}}
>>> class Object: pass
>>> a = Object()
>>> a_ref = weakref.ref(a)
>>> dict1['a'] = a
>>> dict2['subdict']['a'] = a_ref
>>> del dict1['a']
>>> assert not dict2['subdict']['a']() # raises an assertion error
我该怎么做呢?是否有可能使用弱点?我是否误解了weakrefs的目的?
答案 0 :(得分:1)
为什么不制作所有子栏目WeakValueDictionary
?然后,当dict1
中唯一的强引用被删除时,WeakValueDictionary
中的弱引用将导致该条目被自动删除。
示例:
>>> class A: pass
...
>>> import weakref
>>> d1 = {}
>>> d2 = {'sub': weakref.WeakValueDictionary()}
>>> d1['a'] = A()
>>> d2['sub']['a'] = d1['a']
>>> del d1['a']
>>> d2['sub']['a']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/weakref.py", line 56, in __getitem__
o = self.data[key]()
KeyError: 'a'
请确保在测试期间,您不会意外地将一个本地或全局变量绑定到您的对象(例如,在您的示例中,a
仍然是绑定到Object()
的本地名称实例,它将保持活着)。您可del
个名称(例如del a
)以确保其被清除。