我不确定我是否遗漏了一些显而易见的东西,但是我不能为我的生活找出下面的代码如何设法给它输出它。
import collections
tree = collections.defaultdict(dict)
tree[0][1] = tree[1]
print tree
tree[1][2] = tree[2]
print tree
这是神奇的输出:
defaultdict(<type 'dict'>, {0: {1: {}}, 1: {}})
defaultdict(<type 'dict'>, {0: {1: {2: {}}}, 1: {2: {}}, 2: {}})
第一行输出完全有意义。然后考虑赋值tree[1][2] = tree[2]
及其后续输出。
我了解条目2: {}
是通过评估RHS表达式tree[2]
创建的。
我也理解创建条目1: {2: {}}
是评估LHS表达式tree[1][2]
并将其分配给RHS的值。
我不明白的是,当没有提及0: {1: {}}
时,词典条目0: {1: {2: {}}}
如何更新为tree[0]
。
答案 0 :(得分:4)
因为当您执行tree[0][1] = tree[1]
时,tree[0][1]
引用与tree[1]
相同的对象,因此如果tree[1]
内发生任何更改,它也会反映在tree[0][1]
中}}
而且,当您执行tree[1][2]
时,您实际上是在tree[1]
内进行更改,而不是让tree[1]
引用新对象。
示例,在您进行更改后尝试执行此操作 -
>>> tree[1]['blah'] = 'Hello'
>>> print(tree)
defaultdict(<class 'dict'>, {0: {1: {2: {}, 'blah': 'Hello'}}, 1: {2: {}, 'blah': 'Hello'}, 2: {}})
只有当您执行类似 - tree[1] = <somethingelse>
的操作时,才会tree[1]
引用新对象,在这种情况下,它不会反映在tree[0][1]
中。
答案 1 :(得分:0)
许多对象(不是基元)存储为引用,而不是值。因此,如果您将a分配给b,则更改a,b也会更改。