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()
考虑到dict
s的值本身是可变的,您可能需要深度复制,将import copy
添加到脚本的顶部,而不是使用:
b = copy.deepcopy(a)
为了简化代码,您可能希望完全删除b
的原始定义,并将b = copy.deepcopy(a)
移动到循环的顶部;b
只备份a
的状态,当您可以在每次开始修改之前无条件地备份状态时,复制定义是毫无意义的(这假设您从未遇到while
循环退出的情况,在a
修改之后,在b
更新之前,您希望b
更新;在当前代码中,这并不重要,但在"real"代码,所以这是一个判断调用)。
作为旁注:您的代码只能工作,因为您依赖于全局变量在您的函数中可见。函数应该只对它的参数进行操作,所以每次在x
中使用a
都应该使用a1
;在这种情况下,这不会影响行为,但是如果在其他地方使用了这段代码,并且传入了不同的dict
,则函数将忽略它并继续改变定义它的全局a
。