Python嵌套字典存储多人同键名数据时输出异常问题排查
解决字典嵌套时数据被覆盖的问题
嘿,这个问题我之前也碰到过!本质是你没搞清楚Python里可变对象的引用机制,咱们来一步步捋明白:
为什么会被覆盖?
你代码里的data是同一个字典对象,每次修改data['label']和data['confidence']的时候,都是在修改这个唯一的字典。当你把data赋值给mdata的不同键(比如mdata[count]=data),其实只是把这个字典的引用存进了mdata里,而不是复制了一份新字典。所以最后所有键指向的都是同一个字典,自然会被最后一次的修改覆盖。
举个直观的例子:你相当于把同一个盒子贴了三个不同的标签(1、2、3),每次修改盒子里的东西,三个标签对应的都是同一个盒子,最后看到的当然是最后放进去的内容。
怎么解决?
核心就是每次添加新数据时,都创建一个全新的字典对象,而不是反复修改同一个。这里给你三种常用的写法:
写法1:每次重新初始化字典
最简单的方式,每次存数据前都新建一个空字典:
import json mdata = {} count = 1 # 第一条人员数据 data = {} data['label'] = 'person1' data['confidence'] = '60' mdata[count] = data # 第二条,新建字典! data = {} data['label'] = 'person2' data['confidence'] = '50' mdata[count+1] = data # 第三条,同样新建字典 data = {} data['label'] = 'person3' data['confidence'] = '40' mdata[count+2] = data print(mdata)
写法2:用字典拷贝
如果不想每次重新初始化,也可以用copy()方法创建当前字典的浅拷贝,把拷贝后的对象存进mdata:
import json data = {} mdata = {} count = 1 data['label'] = 'person1' data['confidence'] = '60' mdata[count] = data.copy() # 存拷贝,不是原字典的引用 data['label'] = 'person2' data['confidence'] = '50' mdata[count+1] = data.copy() data['label'] = 'person3' data['confidence'] = '40' mdata[count+2] = data.copy() print(mdata)
写法3:直接用字典字面量(最简洁)
干脆省略单独的data变量,直接在赋值时创建新字典,代码更紧凑:
import json mdata = {} count = 1 mdata[count] = {'label': 'person1', 'confidence': '60'} mdata[count+1] = {'label': 'person2', 'confidence': '50'} mdata[count+2] = {'label': 'person3', 'confidence': '40'} print(mdata)
不管用哪种写法,最终的输出都会是你想要的结果:
{1: {'label': 'person1', 'confidence': '60'}, 2: {'label': 'person2', 'confidence': '50'}, 3: {'label': 'person3', 'confidence': '40'}}
小提醒
Python里的可变对象(字典、列表、自定义类实例等)赋值时都是传递引用,不是复制对象。如果需要独立的对象,一定要显式创建副本或者新建对象,不然就会出现这种“数据被覆盖”的坑~
内容的提问来源于stack exchange,提问作者SANKET DARWANTE
相关产品推荐
相关产品推荐

