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

Python嵌套字典赋值异常:旧数据被覆盖问题咨询

问题:嵌套字典存储竞价数据时旧数据被覆盖的原因与解决方法

你的问题核心在于Python中字典是可变对象,赋值操作传递的是对象引用而非副本:

  • 你在循环外初始化了bidder_details字典,每次循环只是修改它的键值对,而非创建新字典。
  • bidders[ID] = bidder_details这行代码并没有把字典的内容存进去,而是把这个字典的引用存入了bidders。因此所有ID对应的都是同一个字典对象,最后一次循环的赋值会覆盖所有引用指向的内容。

解决方法1:循环内新建字典(推荐)

每次循环创建一个全新的bidder_details字典,从根源避免引用复用:

# Initializing dictionaries
bidders = {}

# Loop for storing bidders details
new_entry = "yes"
ID = 0
while new_entry.lower() == "yes":
    name = input("What is your name?: ")
    amount = float(input("What's your bid?: "))
    ID += 1
    # 每次循环新建字典,存储当前竞价者的信息
    bidder_details = {
        "bidder_name": name,
        "bid_amount": amount
    }

    bidders[ID] = bidder_details

    new_entry = input("Are there any other bidders? Type 'yes' or 'no'\n").lower()
    if new_entry not in ("no", "yes"):
        print("\nIncorrect input! Taking no new bidders.")
        new_entry = "no"


print(f"\n{bidders}")

解决方法2:存储字典副本

如果需要复用外部字典,每次存储时使用copy()方法创建浅拷贝(当前场景下字典值都是不可变类型,浅拷贝足够):

# Initializing dictionaries
bidder_details = {}
bidders = {}

# Loop for storing bidders details
new_entry = "yes"
ID = 0
while new_entry.lower() == "yes":
    name = input("What is your name?: ")
    amount = float(input("What's your bid?: "))
    ID += 1
    # 更新原字典内容
    bidder_details["bidder_name"] = name
    bidder_details["bid_amount"] = amount

    # 存储字典副本,而非原字典引用
    bidders[ID] = bidder_details.copy()

    new_entry = input("Are there any other bidders? Type 'yes' or 'no'\n").lower()
    if new_entry not in ("no", "yes"):
        print("\nIncorrect input! Taking no new bidders.")
        new_entry = "no"


print(f"\n{bidders}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:10:23