在看似相同的词典中赋值的方式不同

时间:2015-10-29 13:24:15

标签: python python-2.7

当我尝试为一个键分配一个新值时,我的两个相同的嵌套词典(一个包含词典的词典)通过不同的方式创建,行为不同。

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

2 个答案:

答案 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即可