在python中对另一个dict中的另一个dict中的一个项进行弱化

时间:2014-04-25 05:42:29

标签: python dictionary weak-references

这是一个复杂的问题设置,但我会尽力解释。我的情况是我有两个词典dict1dict2dict1包含两个词典中的每个项目,但它保留实际对象(而不是对象的引用)。另一个重要因素是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的目的?

1 个答案:

答案 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)以确保其被清除。