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
相关产品推荐
相关产品推荐

