You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:09:21