你能用Python defaultdict和autovivification

时间:2015-07-12 11:41:53

标签: python defaultdict

我不确定我是否遗漏了一些显而易见的东西,但是我不能为我的生活找出下面的代码如何设法给它输出它。

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]

2 个答案:

答案 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也会更改。