Python列表append字典时所有元素重复为最后值的问题排查
问题根因
Python中字典是可变引用类型,你的代码把data_new = {}定义在了循环外层,整个循环过程中始终在操作同一个字典对象。执行append操作时,列表存入的是这个字典的内存引用,不是字典当时的独立副本:
- 后续循环修改
data_new的键值时,之前append到列表里的所有元素因为指向同一个字典对象,值会同步被更新 - 最终列表里的所有元素都会指向最后一次循环修改后的字典,就出现了全是最新值的现象
- 写文件逻辑正常是因为你在每次循环的当下就把
data_new的内容序列化写入了磁盘,后续字典修改不会影响已经落盘的内容,所以输出文件结果符合预期。
修复方案
把data_new的初始化逻辑移到每行JSON的处理循环内部,保证每次处理单行数据时都创建一个全新的空字典,避免复用同一个对象。同时注意补全count变量的初始值定义,避免运行时报NameError。
修正后的核心代码如下:
import json data_list = [] count = 0 # 提前初始化count变量 # 替换为实际的字段映射配置 de = ["Line1", "Line2"] para = ["a", "b"] arquivo = "entrada.json" with open(arquivo, encoding="utf-8") as f: for jsonObj in f: data = json.loads(jsonObj) count += 1 data_new = {} # 每次循环新建独立字典,不要放在循环外 for item in data: if item in de: indice = de.index(item) data_new[para[indice]] = data[item] else: data_new[item] = data[item] data_list.append(data_new) print(data_list)
运行后即可得到预期输出,不会再出现所有元素被最后一次值覆盖的问题。
补充:如果后续遇到必须在循环外初始化字典的场景,也可以在append时传入字典的浅拷贝,比如用
data_list.append(data_new.copy()),但这种方式只适合字典值都是不可变类型(字符串、数字、元组)的场景,值存在嵌套可变对象时需要用深拷贝。当前场景直接在循环内初始化空字典是最简洁高效的方案。
内容的提问来源于stack exchange,提问作者IanPoli
相关产品推荐
相关产品推荐

