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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:22:36