2017-01-13 74 views
0

尝试遍历字典并相应地更新其值。出于某种原因,我无法得到它的工作。下面我创建了一个简单的例子。它将最后迭代的“id”保存到字典中的两个键值中。迭代和更新python字典不工作

示例代码是:

import copy 

##### 
def setParams(params): 
    for key,valuesDict in params.items(): 
     print(key) 
     params[key]['target']['id'] = key 

targetDict = {'id':"",'value':0} 
myParamsTemplate = {'target':targetDict} 
first = copy.copy(myParamsTemplate) 
second = copy.copy(myParamsTemplate) 


params = {"1":first,"2":second} 

print("before:\n",params) 

setParams(params) 

print("after:\n",params) 

打印出:

before: 
{'1': {'target': {'id': '', 'value': 0}}, '2': {'target': {'id': '', 'value': 0}}} 
1 
2 
after: 
{'1': {'target': {'id': '2', 'value': 0}}, '2': {'target': {'id': '2', 'value': 0}}} 

的 'id' 应分别1和2,但结果总是 '2' 两种。

回答

1

因为你只做一个浅拷贝(它不会拷贝最内层的字典)。您可以通过打印params["1"]["target"] is params["2"]["target"]轻松验证此情况,它应该返回True(这意味着它们是相同的对象)。

你可以把它用copy.deepcopy工作:

first = copy.deepcopy(myParamsTemplate) 
second = copy.deepcopy(myParamsTemplate) 
+0

@ user1179317不客气。 – MSeifert