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

为何打印字典b时输出的是未存储的当前字典a数据?

问题排查与修复方案

问题根源

你遇到的问题是Python可变对象的引用特性导致的:

  • 字典属于可变对象,执行b = a时,并没有复制a的内容给b,只是让变量b和a指向内存中同一个字典对象。
  • 当你在循环里调用x()函数修改a的内容时,b因为和a指向同一个对象,内容会同步变化。这就导致打印b时,看到的是刚修改的a的数据,而非预期的历史数据。

修复方法

需要对嵌套字典进行深度拷贝,确保b拥有独立的字典对象,不会随a的修改而变化:

  1. 导入copy模块,使用copy.deepcopy()方法复制字典的所有层级内容。
  2. 将原代码中的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:15:36