python - 更改列表中具有相同键的字典的值

标签 python dictionary for-loop

我有这个:

[{'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/

相关文章:

python:替代匿名函数

具有绑定(bind)值的 python itertools 排列

python - 计数器列表 python 2.7

javascript - 如何为 JavaScript 字典创建和添加值

android - 需要使用 for 循环中使用的变量

c++ - c++ 中的设置函数不起作用

python - 为什么平均 Pandas 中的选定列会给出错误的结果?

python - 迭代 Python3 map 的最快方法

Swift - 将文本添加到字典

java - 使用线程池对 for 循环内完成的工作进行多线程处理