2013-12-14 34 views
2

所以我嵌套的词典中删除对象的字典对象如何通过引用从另一个变量

a = {'a':{'b':[1,2,3]}} 

我必须嵌套“B”的引用:

c=a['a']['b'] 

现在,当我调用

del c 
print a 

的结果是

{'a':{'b':[1,2,3]}} 

变量c被删除,但它引用的对象仍然存在。我想完全删除嵌套的'b'对象。这是很容易与

del a['a']['b'] 

这样做,但在这种实际应用中,嵌套太深,这是使用过于频繁为实现这一目标是可行的。

问题:如何删除一个字典标签只有在另一个变量中引用它?

+0

'del'删除了指定的引用;您不能删除*其他*引用,例如为'a ['a'] ['b']'存储的引用。您必须存储一个'路径',解析除最后一个元素*之外的所有路径*,然后删除该引用。 –

+0

如果您知道''c''而不知道''a'''和'''b'',Martijn的解决方案是不适用的。如果你知道''''''''''''b'',它的解决方案对使用''a ['a'] ['b']''有什么好处?有一些我不明白.... – eyquem

回答

4

del处理提供的参考只有;它不能删除对其他地方的相同值的引用。这不是Python的工作原理。

商店路径在嵌套结构:

path = ('a', 'b') 

可以解决这样的路径:

def resolve_path(dictionary, path): 
    return reduce(dict.get, path, dictionary) 

,或者你可以得到,之后就可以删除最后一个元素:

def del_endpoint(dictionary, path): 
    parent_path, last = path[:-1], path[-1] 
    parent = resolve_path(dictionary, parent_path) 
    del parent[last] 

这当然对于嵌套字典非常具体;对于属性或列表项目,您需要额外的代码。

+0

非常好,我喜欢减少功能的创造性使用。谢谢! – brthornbury

+0

@Martijn,我喜欢你的答案。 @Mozoby,如果你存储路径,请考虑“孤立参考”的情况。如果你保留一个参考文献*和*路径作为Martijn建议,那么你冒着不一致的风险。例如:如果存储路径'('a','b')'并且如果'c = a ['a'] ['b']',然后发生这种情况:'a ['a'] [ 'b'] = [10,20,30]'...现在路径将指向新列表'[10,20,30]'而'c'仍然是旧列表'[1,2,3 ]'。所以'del_endpoint'可以正常工作,但不会影响孤立引用'c'或其内容。这是我们在Python中可以期待的。 –

相关问题