为何打印字典b时输出的是未存储的当前字典a数据?
问题排查与修复方案
问题根源
你遇到的问题是Python可变对象的引用特性导致的:
- 字典属于可变对象,执行
b = a时,并没有复制a的内容给b,只是让变量b和a指向内存中同一个字典对象。 - 当你在循环里调用
x()函数修改a的内容时,b因为和a指向同一个对象,内容会同步变化。这就导致打印b时,看到的是刚修改的a的数据,而非预期的历史数据。
修复方法
需要对嵌套字典进行深度拷贝,确保b拥有独立的字典对象,不会随a的修改而变化:
- 导入
copy模块,使用copy.deepcopy()方法复制字典的所有层级内容。 - 将原代码中的
b = a替换为b = copy.deepcopy(a)。
修改后的完整代码
import random import time import copy # 新增导入copy模块 # 初始化两个字典 a = {"A" : {"Result" : "N", "Time" : "N"}, "B" : {"Result" : "N", "Time" : "N"}, "C" : {"Result" : "N", "Time" : "N"}, "D" : {"Result" : "N", "Time" : "N"}} b = {"A" : {"Result" : "N", "Time" : "N"}, "B" : {"Result" : "N", "Time" : "N"}, "C" : {"Result" : "N", "Time" : "N"}, "D" : {"Result" : "N", "Time" : "N"}} def x(name, a1): v = random.choice(["Yes", "No", "Both", "Yes", "No", "Both", "Yes", "No", "Both", "Yes", "No", "Both"]) if v == "Yes": a[name]["Result"] = "Yes" a[name]["Time"] = "5" elif v == "No": a[name]["Result"] = "No" a[name]["Time"] = "5" else: a[name]["Result"] = "N" a[name]["Time"] = "N" time.sleep(1) while True: # 存入当前数据到字典a x("A", a) x("B", a) x("C", a) x("D", a) # 打印字典b中的历史数据 for i in b.keys(): if b[i]["Result"] == "Yes": print("Yes") elif b[i]["Result"] == "No": print("No") else: print("N") # 将字典a的数据拷贝到字典b(深度拷贝) b = copy.deepcopy(a) time.sleep(30)
内容的提问来源于stack exchange,提问作者Sanmay
相关产品推荐
相关产品推荐

