我意识到在循环遍历它们时改变字典可能会导致运行时错误,但我知道有正确的方法可以做到这一点,我无法弄清楚哪些是可接受的,哪些是不可接受的。控制台测试它们并没有帮助,因为它们可能会产生运行时错误,我不确定我是否正确或者只是运气不好。
假设我有一个属性status,即状态字典:
self.status = {"overall": False, "started":False,
"ready":False, "awakeQueried":False,
"allQueried":False}
这些在整个跑步过程中会改变为各种各样的真理或法尔斯。我有一个处理失败的函数,并希望将它们全部设置为False。优雅的方式是什么?到目前为止,我有这个工作,但我不确定我是否会在某个时候遇到运行时错误:
self.status = {key:False for key in self.status}
我能这样做吗?我不确定这里的低级别功能。我没有使用.items()等制作副本。我覆盖了字典,但它应该首先处理右侧,但它是一种理解,所以我不确定它是否在覆盖self.status之前完成整个理解。它是否在记忆中存储了一种副本,同时它理解了新的字典,然后设置它或者在每次迭代后循环通过字典理解和设置项目(这是我认为会出现问题的地方)?
答案 0 :(得分:3)
这将完全适用于您所描述的原因:右侧理解会创建一个新词典并在self.status
设置之前完成。
答案 1 :(得分:1)
是的,这将有效。在Python中,变量是引用,因此您在右侧创建一个新的字典,然后在一个步骤中将其分配给self.status
,从而不会留下读取和写入单个字典的运行时错误的空间。