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

Python循环中JSON对象属性被覆盖问题求助

问题分析与解决方案

你的问题出在Python中字典是可变对象,赋值操作传递的是引用这一点上。在循环里,你每次都把json_template直接赋值给jsonElement,这意味着所有的jsonElement其实都是指向同一个字典对象的引用。所以每次修改jsonElement['name']的时候,你都是在修改同一个字典,最后数组里的所有元素自然都会变成最后一次修改的结果。

修正方案

你需要在每次循环中创建一个json_template的副本,而不是直接引用原对象。这里有几种常见的实现方法:

方法1:使用字典的copy()方法

这是最直观的方式,直接复制原字典生成新对象:

def processElements(fruitsArray):
    jsonElementArray = []
    for fruit in fruitsArray:
        jsonElement = json_template.copy()  # 创建原字典的副本
        jsonElement['name'] = fruit['id']
        jsonElementArray.append(jsonElement)
    return jsonElementArray

方法2:使用dict()构造函数

借助dict()构造函数基于原字典生成新字典:

def processElements(fruitsArray):
    jsonElementArray = []
    for fruit in fruitsArray:
        jsonElement = dict(json_template)  # 基于原模板创建全新字典
        jsonElement['name'] = fruit['id']
        jsonElementArray.append(jsonElement)
    return jsonElementArray

方法3:使用字典解包(Python 3.5+)

这种写法更简洁,一步完成复制和字段修改:

def processElements(fruitsArray):
    jsonElementArray = []
    for fruit in fruitsArray:
        # 解包原字典的所有键值对,同时覆盖name字段
        jsonElement = {**json_template, 'name': fruit['id']}
        jsonElementArray.append(jsonElement)
    return jsonElementArray

测试验证

用你的输入示例测试修正后的代码,调用prueba函数后,输出会完全符合预期:

[{'type': 'fruit', 'name': 'apple'}, {'type': 'fruit', 'name': 'banana'}, {'type': 'fruit', 'name': 'orange'}]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:30:16