Python JSON归一化函数处理字典数组所有元素均为最后一个值问题
问题原因
- 核心是踩到了Python可变默认参数的设计特性:函数定义时就会初始化默认参数对应的对象,后续所有不传该参数的调用,都会复用同一个对象。
- 你代码里
normalized_dict: dict = {}的默认值是空字典,三次调用normalize_json(row)都没有主动传这个参数,所以全程复用同一个字典实例:- 处理第一条数据时,往公共字典里写入第一条的字段
- 处理第二条数据时,直接在同一个公共字典上覆盖写入第二条的字段,原有内容被替换
- 处理第三条数据时,继续覆盖写入第三条的字段,最终三次返回的字典内容都是最后一次覆盖后的结果
修复方案
不要将可变对象作为函数默认参数,把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
相关产品推荐
相关产品推荐

