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
相关产品推荐
相关产品推荐

