当我在python上执行此操作时,我会一次更新所有键。
>>> base = {}
>>> keys = ['a', 'b', 'c']
>>> base.update(dict.fromkeys(keys, {}))
>>> base.get('a')['d'] = {}
>>> base
{'a': {'d': {}}, 'c': {'d': {}}, 'b': {'d': {}}}
>>> map(id, base.values())
[140536040273352, 140536040273352, 140536040273352]
如果我使用.get
运算符代替[]
,则不会发生这种情况:
>>> base['a']['d'] = {}
>>> base
{'a': {'d': {}}, 'c': {}, 'b': {}}
为什么?
答案 0 :(得分:0)
当您将新键的值初始化为{}
时,将创建一个新词典,并且对该词典的引用将成为值。只有一个字典,所以如果你改了一个,你就会改变“全部”。
答案 1 :(得分:0)
我用Python 2.7.6和3.4.3尝试过。当使用get('a')
或['a']
时,我会得到相同的答案。如果您能在最后验证这一点,请感谢您。 Python确实反对对象。因此,dict.fromkeys()
重新使用相同的空dict
进行初始化。要使每个对象成为一个单独的对象,您可以这样做:
base.update(zip(keys, ({} for _ in keys)))