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

