为什么字典在存储数据之前打印数据?


import random
import time
#2 Dictionary
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:
#Storing the current data on dict1
x("A", a)
x("B", a)
x("C", a)
x("D", a)

for i in b.keys():
#Printing the previously stored data on dict2.
if b[i]["Result"] == "Yes":
print("Yes")
elif b[i]["Result"] == "No":
print("No")
else:
print("N")

#Storing the current dict1 data on dict2
b = a
time.sleep(30)  

在这里,我期望当循环开始时,将当前数据存储在dicta上,然后打印dictb数据,然后将dicta数据存储在dictb上,然后再次循环重新启动,将当前数据存储在dicta上,然后打印过去的数据存储在dictb上,然后再次将当前dicta数据存储在dictb上。然后继续

但是我不知道为什么在打印字典b过去的数据时,它打印了尚未存储在字典b上的当前数据

请帮助谁知道

在每个循环结束时,b = a意味着您(重新)将b别名为a所引用的dict;它不是复制,它只是说"无论a当前引用的对象是什么,让b也引用它(无论b之前是什么都无关紧要)"。你永远不会重新分配a,所以在第一次混叠之后,它们是两个名字,都引用了相同的dict;通过a所做的更改可以在b上看到,反之亦然。

如果你想把快照a变成b(做一个浅拷贝),修改:

b = a

:

b = a.copy()

考虑到dicts的值本身是可变的,您可能需要深度复制,将import copy添加到脚本的顶部,而不是使用:

b = copy.deepcopy(a)

为了简化代码,您可能希望完全删除b的原始定义,并将b = copy.deepcopy(a)移动到循环的顶部;b只备份a的状态,当您可以在每次开始修改之前无条件地备份状态时,复制定义是毫无意义的(这假设您从未遇到while循环退出的情况,在a修改之后,在b更新之前,您希望b更新;在当前代码中,这并不重要,但在"real"代码,所以这是一个判断调用)。


作为旁注:您的代码只能工作,因为您依赖于全局变量在您的函数中可见。函数应该只对它的参数进行操作,所以每次在x中使用a都应该使用a1;在这种情况下,这不会影响行为,但是如果在其他地方使用了这段代码,并且传入了不同的dict,则函数将忽略它并继续改变定义它的全局a

最新更新