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

如何将多个SuperHero类实例存入Python字典避免覆盖?

解决FastAPI+Pydantic中SuperHero实例存入字典被覆盖的问题

你遇到的问题本质是字典键冲突:当你直接用ROSTER.update(SHx.dict())时,每个实例的dict()方法返回的字典结构完全一致(比如都包含name、power等键),每次update都会用新值覆盖ROSTER里的同名键,最终只剩最后一个实例的内容。

下面是两种直接有效的解决方式,不需要转列表再转回字典:

方案1:用唯一标识作为字典键批量构建

给每个SuperHero实例分配一个唯一的顶层键(比如英雄名称、自定义ID),用字典推导式一次性构建ROSTER:

from pydantic import BaseModel

class SuperHero(BaseModel):
    name: str
    power: str
    team: str

# 创建实例
SH1 = SuperHero(name="Iron Man", power="Repulsor Beams", team="Avengers")
SH2 = SuperHero(name="Captain America", power="Super Strength", team="Avengers")
SH3 = SuperHero(name="Wonder Woman", power="Lasso of Truth", team="Justice League")
SH4 = SuperHero(name="Batman", power="Genius Intellect", team="Justice League")

# 用英雄名称作为唯一键,直接构建完整字典
ROSTER = {hero.name: hero.dict() for hero in [SH1, SH2, SH3, SH4]}

这样每个实例都对应独立的键,不会出现覆盖问题。

方案2:带唯一键的update调用

如果需要保留逐个update的方式,每次update时传入一个包含唯一顶层键的字典,而不是直接传入实例的dict()结果:

ROSTER = {}
# 每次update的是{唯一键: 实例字典}的结构
ROSTER.update({SH1.name: SH1.dict()})
ROSTER.update({SH2.name: SH2.dict()})
ROSTER.update({SH3.name: SH3.dict()})
ROSTER.update({SH4.name: SH4.dict()})

为什么ChainMap和合并没生效?

  • ChainMap是逻辑合并多个字典,并没有真正合并成一个物理字典,且如果原字典有重复键,ChainMap会优先取第一个出现的值,不符合你要保留所有实例的需求。
  • {**ROSTER, **SHx.dict()}这种合并方式,本质和update一样,因为SHx.dict()的键和ROSTER里的键重复,会直接覆盖原有值,所以无法保留所有实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:27:26