【发布时间】:2017-04-18 18:14:23
【问题描述】:
这似乎是 setdefault 和 defaultdict 的一个非常简单的用法,我无法理解,如果有人能解释“为什么”下面的代码有效,那就太好了。
d = {}
for name in ['foo', 'bar', 'bars']:
t = d
for char in name:
t = t.setdefault(char,{}) # Should be a empty {}
print d
# Prints {'b': {'a': {'r': {'s': {}}}}, 'f': {'o': {'o': {}}}}
我无法理解这段代码是如何工作的。当 t = t.setdefault(char,{}) 行执行时,它应该为 t 分配一个空字典,但是它如何影响 d 以使 d 最终成为嵌套字典?
另外,如果我使用defaultdict,那么与上述内容的等价物是什么。我想出了这个错误:
d1 = defaultdict(dict)
for name in ['foo', 'bar', 'bars']:
t1 = d1
for char in name:
t1 = t1[char]
print d1
如果有人能指出应该如何理解 defaultdicts,那就太好了
【问题讨论】:
-
与列表一样,
t和d都指向同一个 dict 对象。当t发生变化时,d也会发生变化。 -
好的,我现在有点明白了。因此,当语句 t = t.setdefault(char,{}) 执行时,t.setdefault(char,{}) 部分会改变字典 d,并且由于右侧评估为 {} , t 设置为 {}。这种理解正确吗?
-
@VikashRajaSamuelSelvin:您的理解是正确的。如果程序根本不使用
t变量,而只是使用_ = d.setdefault(char, {}),程序会以同样的方式工作,并且会更清晰。下划线变量将提供一个线索,表明该分配刚刚被丢弃(即是)。 -
@Gerrat 如果我使用 _ = d.setdefault(char, {}) 它返回 {'a': {}, 'b': {}, 'f': {} , 'o': {}, 's': {}, 'r': {}} 这是我所期望的,但语句 t = t.setdefault(char,{}) 它有效地创建了一个形式为 {'b': {'a': {'r': {'s': {}}}}, 'f': {'o': {' o':{}}}}。我似乎无法理解这一点,如果你能解释为什么会发生这种行为,那就太好了。谢谢。
-
@VikashRajaSamuelSelvin:啊,我明白了。我之前的理解是不正确的。这实际上很有趣。我看看能不能给出一个简单的解释。
标签: python python-2.7 dictionary nested defaultdict