当我尝试为一个键分配一个新值时,我的两个相同的嵌套词典(一个包含词典的词典)通过不同的方式创建,行为不同。
d = {'a': {'item': None},'b': {'item': None},'c': {'item': None}}
第一个字典是手动创建的,而第二个字典是通过以下代码创建的:
data = {"item" : None}
keys = ["a","b","c"]
d2 = dict()
for i in range(len(keys)):
d2[keys[i]] = data
这两个都给出了看似相同的词典。
print d
{'a': {'item': None}, 'c': {'item': None}, 'b': {'item': None}}
print d2
{'a': {'item': None}, 'c': {'item': None}, 'b': {'item': None}}
到目前为止,一切似乎都很好,但是当我尝试更改任何键的值时,会发生这种情况:
d["a"]["item"] = "1"
d2["a"]["item"] = "1"
print d
{'a': {'item': '1'}, 'c': {'item': None}, 'b': {'item': None}}
print d2
{'a': {'item': '1'}, 'c': {'item': '1'}, 'b': {'item': '1'}}
我已经尝试了所有我能想到的东西,而且找不到有类似问题的人。它只是没有意义,为什么它会改变所有三个内部词典的价值?我希望你们能帮忙 我正在使用Python 2.7.5
答案 0 :(得分:4)
您需要为每个条目创建一个唯一的dict,如下所示:
keys = ["a","b","c"]
d2 = dict()
for i in range(len(keys)):
d2[keys[i]] = {"item" : None}
另外,您可能更喜欢更加抒情的方式:
>>> {k:{'item':None} for k in ['a','b','c']}
{'a': {'item': None}, 'c': {'item': None}, 'b': {'item': None}}
答案 1 :(得分:1)
当您指定dict2 = dict1
时,您没有复制dict1
,导致dict2
只是dict1
的另一个名称。
您可以使用deepcopy
:
data = {"item" : None}
keys = ["a","b","c"]
d2 = dict()
for i in range(len(keys)):
d2[keys[i]] = copy.deepcopy(data)
但如果您有以下数据:
data = {"item1" : None, "item2":{"Book":none}}
您的数据dictionary
中的另一个dictionary
,您必须像上面一样使用deepcopy
。
否则,您可以通过不同的方式复制dict
。像
d2[keys[i]] = copy.copy(data)
d2[keys[i]] = dict(data)
d2[keys[i]] = data.copy()
您可以使用任意内容复制dict
。嵌套deepcopy
dict
即可