字典值重复问题:为何循环添加字典后结果不符合预期?
问题原因分析:列表中字典重复显示同一值
原代码
test = [{'name' : 'one'}, {'name' : 'two'}] a = {} b = [] c = {} for i in test: c['name'] = i['name'] b.append(c) a['items'] = b print(a)
错误输出
{'items': [{'name': 'two'}, {'name': 'two'}]}
核心原因
你在循环外部定义了字典c,整个循环过程中始终操作的是同一个字典对象。每次循环里的c['name'] = i['name']只是修改这个字典的name值,而b.append(c)添加到列表里的是这个字典的引用(不是新字典的副本)。
第一次循环时,c的name被设为'one',列表b添加了该字典的引用;第二次循环时,c的name被覆盖为'two',列表b再次添加同一个字典的引用。最终打印时,列表里的两个元素指向的都是同一个字典,自然显示的都是最后一次修改的'two'。
修复方案
有两种简单的解决方式:
- 方法一:在循环内部创建新字典
test = [{'name' : 'one'}, {'name' : 'two'}] a = {} b = [] for i in test: c = {} # 每次循环生成新字典对象 c['name'] = i['name'] b.append(c) a['items'] = b print(a)
- 方法二:添加字典的副本到列表
test = [{'name' : 'one'}, {'name' : 'two'}] a = {} b = [] c = {} for i in test: c['name'] = i['name'] b.append(c.copy()) # 存入字典副本而非引用 a['items'] = b print(a)
两种方法都能让列表b中的元素成为独立的字典对象,最终输出预期结果:{'items': [{'name': 'one'}, {'name': 'two'}]}
内容的提问来源于stack exchange,提问作者Shivam Singhal
相关产品推荐
相关产品推荐

