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

Python for循环中将修改后的字典append到列表出现数据不一致问题

问题原因
  • 浅拷贝的底层限制:Python内置的dict.copy()属于浅拷贝,仅会复制字典的顶层结构,对于字典内部嵌套的gridPos子字典、targets列表这类可变对象,只会复制其引用地址,并不会生成独立的新对象。这就导致后续修改嵌套层级的内容时,所有引用了该嵌套对象的拷贝都会同步更新,最终列表里所有元素的嵌套字段都变成了最后一次修改的结果。
  • 重复调用函数导致的额外修改:你第二版代码的循环逻辑里,每次循环先后调用了两次test(data,x):第一次是print(test(data,x)),第二次是test_list.append(test(data,x).copy()),相当于每次循环数据会被修改两次,这也是你print输出和列表存储内容不匹配的直接原因。
修复方案
  1. 用copy.deepcopy()替换普通的copy(),实现完全独立的深拷贝,嵌套结构也会生成全新的独立对象,修改不会互相影响。
  2. 每次循环只调用一次test函数,把结果存到临时变量里,再分别用于打印和存入列表。

修正后代码示例

import copy
# 原始数据结构和你GET请求获取的一致
data = {"datasource": "InfluxDB", "gridPos": {"h": 4, "w": 3, "x": 3, "y": 14}, "id": 80, "targets": [{"measurement": "database"}, {"measurement": "database"}],"title": "Name"}
test_list = []

def test(origin_data, database):
    # 先对原始数据做深拷贝,不修改原始传入的数据
    new_data = copy.deepcopy(origin_data)
    new_data['gridPos']['x'] += new_data['gridPos']['w'] + 1
    new_data['gridPos']['y'] += new_data['gridPos']['h'] + 1
    new_data['id'] += 1
    new_data['targets'][0]['measurement'] += str(database) 
    return new_data

for x in range(0,10):
    # 每次循环只调用一次test函数,拿到结果后复用
    current_data = test(data, x)
    print(current_data)
    test_list.append(current_data)
    # 如果需要下一次循环基于本次修改后的结果继续计算,就把data更新为current_data
    data = current_data

print(test_list)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:24:03