我有这个:
[{'name': 'Peter'}, {'name': 'Anna'}]
我想用它来做这个:
[{'name': '彼得·威廉姆斯'}, {'name': '安娜·威廉姆斯'}]
所以我做到了:
>>> li = [{'name': 'Peter'}, {'name': 'Anna'}]
>>> new_li = []
>>> dic = {}
>>> for i in li:
... dic["name"] = i["name"] + " Williams"
... new_li.append(dic)
但是:
>>> new_li
[{'name': 'Anna Williams'}, {'name': 'Anna Williams'}]
为什么?
您能否展示如何最好地获取[{'name': 'Peter Williams'}, {'name': 'Anna Williams'}]
?
编辑
我不理解这种行为的原因是因为我认为:
>>> dict = {'name':'Peter'}
>>> lis = [dict]
>>> dict['name'] = 'Olaf'
哪里
>>> print lis
给出
[{'name': 'Peter'}]
事实上确实如此
[{'name': 'Olaf'}]
最佳答案
因为您在每次迭代中使用相同的字典对象。
在第二次迭代中,您将更改在上一次迭代中分配给 name
键的值,并且您的列表最终包含对同一对象的两个引用。
我强烈建议您查看“Python Tutor”工具 (pythontutor.com),它允许您可视化某些 Python 代码的执行情况,并查看堆栈中正在创建哪些对象。例如Python Tutor with your code
做你想做的事情的正确方法是:
li = [{'name': 'Peter'}, {'name': 'Anna'}]
new_li = []
for p in li:
new_p = {'name': p['name'] + ' Williams'}
new_li.append(new_p)
这样每次迭代都会创建一个新的字典对象。
更简洁的解决方案:
li = [{'name': 'Peter'}, {'name': 'Anna'}]
new_li = [{'name': p['name'] + ' Williams'} for p in li]
关于python - 更改列表中具有相同键的字典的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13204246/