在python中,在另一个目录的子目录中从一个目录中Weakref一个项目
这是一个有点复杂的问题设置,但我会尽我所能解释它。我有两本字典,在python中,在另一个目录的子目录中从一个目录中Weakref一个项目,python,dictionary,weak-references,Python,Dictionary,Weak References,这是一个有点复杂的问题设置,但我会尽我所能解释它。我有两本字典,dict1和dict2dict1包含两个词典中的每个条目,但它保留了实际对象(而不是对象的引用)。另一个重要因素是dict1将所有条目存储在一个词典中;本身 然而,dict2被划分为多个子区,每个子区包含来自dict1的一个或多个项目,因此dict1中的所有对象也位于dict2子区的交叉点,并且没有重复项。现在的问题是,我想对dict2子目录中的项目进行弱引用,这样当项目从dict1中删除时,它在dict2子目录中的引用也是如此 例
dict1
和dict2
dict1
包含两个词典中的每个条目,但它保留了实际对象(而不是对象的引用)。另一个重要因素是dict1
将所有条目存储在一个词典中;本身
然而,dict2
被划分为多个子区,每个子区包含来自dict1
的一个或多个项目,因此dict1
中的所有对象也位于dict2
子区的交叉点,并且没有重复项。现在的问题是,我想对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?我是不是误解了weakrefs的目的?为什么不把所有的子词典都改成英文?然后,当删除
dict1
中唯一的强引用时,WeakValueDictionary
中的weakref将导致自动删除该条目
例如:
>>> 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类:合格
...
>>>进口武器
>>>d1={}
>>>d2={'sub':weakref.weakValue字典()}
>>>d1['a']=a()
>>>d2['sub']['a']=d1['a']
>>>德尔d1['a']
>>>d2['sub']['a']
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python2.7/weakref.py”,第56行,在__
o=自身数据[键]()
KeyError:'a'
确保在测试过程中不会意外地将局部或全局变量绑定到对象(例如,在您的示例中,
a
仍然是绑定到object()
实例的局部名称,这将使其保持活动状态)。您可以del
名称(例如dela
)以确保它们被清除。我尝试过,但似乎不起作用。我使用的设置也正是您所描述的。然而,我可能总是做错事,你介意展示一些代码来说明你的观点吗?啊,这是我的问题,没有删除绑定到对象的本地名称。谢谢你的解释!“它保留实际对象(而不是对对象的引用)”。在python中,一切都是引用。没有数据结构“保留实际对象”。您可以将数据结构视为“主”结构,包含“主”引用,而其他数据结构则包含其他引用,但这只是与它们关联的语义。