2017-01-13 4 views
0

Попытка итерации через словарь и обновление его значений соответственно. По какой-то причине я не могу заставить его работать. Я создал простой пример ниже. Он сохраняет последний итерированный «id» для обоих значений ключа в словаре.Iterate и обновить словарь 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

Смежные вопросы