2015-10-29 37 views
2

不知何故,当我尝试为键分配新值时,我的两个相同的嵌套字典(包含字典的字典)通过不同的方式创建。在看起来完全相同的字典中分配的值不同

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

回答

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。 Like

d2[keys[i]] = copy.copy(data) 
d2[keys[i]] = dict(data) 
d2[keys[i]] = data.copy() 

您可以使用任何方式复制您的dict。当您嵌套时只需使用deepcopydict

4

你需要创建一个独特的字典为每个条目,就像这样:

keys = ["a","b","c"] 
d2 = dict() 
for i in range(len(keys)): 
    d2[keys[i]] = {"item" : None} 

而且你可能更喜欢一个更Python的方式:

>>> {k:{'item':None} for k in ['a','b','c']} 
{'a': {'item': None}, 'c': {'item': None}, 'b': {'item': None}} 
相关问题