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

Python JSON归一化函数处理字典数组所有元素均为最后一个值问题

问题原因

  • 核心是踩到了Python可变默认参数的设计特性:函数定义时就会初始化默认参数对应的对象,后续所有不传该参数的调用,都会复用同一个对象。
  • 你代码里normalized_dict: dict = {}的默认值是空字典,三次调用normalize_json(row)都没有主动传这个参数,所以全程复用同一个字典实例:
    1. 处理第一条数据时,往公共字典里写入第一条的字段
    2. 处理第二条数据时,直接在同一个公共字典上覆盖写入第二条的字段,原有内容被替换
    3. 处理第三条数据时,继续覆盖写入第三条的字段,最终三次返回的字典内容都是最后一次覆盖后的结果

修复方案

不要将可变对象作为函数默认参数,把normalized_dict的默认值改为None,在函数内部每次调用时新建独立的空字典即可,修改后的代码如下:

def normalize_json(
   data: dict, key_string: str = "", normalized_dict: dict = None, separator: str = "_"
) -> dict:
   # 每次调用不传normalized_dict时,新建独立的空字典
   if normalized_dict is None:
       normalized_dict = {}
   if isinstance(data, dict):
       for key, value in data.items():
           new_key = f"{key_string}{separator}{key}"
           normalize_json(
               data=value,
               key_string=new_key
               if new_key[: len(separator)] != separator
               else new_key[len(separator) :],
               normalized_dict=normalized_dict,
           )
   else:
       normalized_dict[key_string] = data
   return dict(normalized_dict)

normalize_json_array = [normalize_json(row) for row in graphql_results]

修改后每次处理单行数据都会使用独立的字典存储结果,不会出现互相覆盖的问题,输出即可符合预期。

内容的提问来源于stack exchange,提问作者Titoserch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:24:04