Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,在另一个目录的子目录中从一个目录中Weakref一个项目_Python_Dictionary_Weak References - Fatal编程技术网

在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中,一切都是引用。没有数据结构“保留实际对象”。您可以将数据结构视为“主”结构,包含“主”引用,而其他数据结构则包含其他引用,但这只是与它们关联的语义。