@FM的答案具有正确的总体思路,即递归解决方案,但有些特殊的编码和至少一个错误。我建议改为:
Python 2:
import collectionsdef update(d, u): for k, v in u.iteritems(): if isinstance(v, collections.Mapping): d[k] = update(d.get(k, {}), v) else: d[k] = v return dPython 3:
import collections.abcdef update(d, u): for k, v in u.items(): if isinstance(v, collections.abc.Mapping): d[k] = update(d.get(k, {}), v) else: d[k] = v return d该错误显示当“更新”拥有了
k,
v项目在那里
v是
dict和
k最初不是被更新在字典中的关键- @
FM代码“跳过”更新的这一部分(因为它执行它的新的空
dict其没有保存或任何返回,只是失去了递归调用返回时)。
我的其他更改很小:没有理由让
if/
else构造何时
.get更快,更干净地完成相同的工作,并且
isinstance出于一般性考虑,最好将其应用于抽象基类(而不是具体的基类)。



