迭代并更新python字典不起作用

迭代并更新python字典不起作用,python,dictionary,copy,Python,Dictionary,Copy,尝试遍历字典并相应地更新其值。由于某种原因,我不能让它工作。我在下面创建了一个简单的示例。它将最后一次迭代的“id”保存到字典中的两个键值 示例代码是: import copy ##### def setParams(params): for key,valuesDict in params.items(): print(key) params[key]['target']['id'] = key targetDict = {'id':"",'valu

尝试遍历字典并相应地更新其值。由于某种原因,我不能让它工作。我在下面创建了一个简单的示例。它将最后一次迭代的“id”保存到字典中的两个键值

示例代码是:

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

因为您只做了一个浅层复制,而不复制最里面的字典。您可以通过打印params[1][target]是否为params[2][target]来轻松验证这一点。它应该返回True,这意味着它们是同一个对象

您可以使用以下方法使其工作:

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