Python -- 我在 for 循环中改变字典的方式不同
Python -- differences in how I mutate dictionaries in a for loop
我意识到在遍历字典时改变字典会导致 运行 时间错误,但我知道有正确的方法可以做到这一点,但我不知道哪些是可以接受的,哪些不是。控制台测试它们无济于事,因为它们可能会产生 运行 时间错误,我不确定我是正确还是只是走运。
假设我有一个属性 status,它是一个状态字典:
self.status = {"overall": False, "started":False,
"ready":False, "awakeQueried":False,
"allQueried":False}
这些在整个 运行ning 期间会变为各种正确或错误。我有一个处理失败的函数,想将它们全部设置为 False。什么是优雅的方式?到目前为止我有这个工作,但我不确定我是否会 运行 在某个时候进入 运行 时间错误:
self.status = {key:False for key in self.status}
我可以吗?我不确定这里的低级功能。我没有使用 .items() 等进行复制。我正在覆盖字典,但它应该先处理右侧,但这是一个理解,所以我不确定它是否在覆盖 self.status 之前先完成整个理解。它是在理解新的字典然后设置它的同时在内存中存储一种副本,还是在每次迭代后循环理解和设置项目的字典(这是我认为会出现问题的地方)?
这将完全按照您描述的原因工作:右侧理解创建一个新词典并在 self.status
设置为它之前完成。
是的,这行得通。在 Python 中,变量是引用,因此您在右侧创建一个新字典,然后一步将其分配给 self.status
,不留任何空间读取和写入单个字典的运行时错误.
我意识到在遍历字典时改变字典会导致 运行 时间错误,但我知道有正确的方法可以做到这一点,但我不知道哪些是可以接受的,哪些不是。控制台测试它们无济于事,因为它们可能会产生 运行 时间错误,我不确定我是正确还是只是走运。
假设我有一个属性 status,它是一个状态字典:
self.status = {"overall": False, "started":False,
"ready":False, "awakeQueried":False,
"allQueried":False}
这些在整个 运行ning 期间会变为各种正确或错误。我有一个处理失败的函数,想将它们全部设置为 False。什么是优雅的方式?到目前为止我有这个工作,但我不确定我是否会 运行 在某个时候进入 运行 时间错误:
self.status = {key:False for key in self.status}
我可以吗?我不确定这里的低级功能。我没有使用 .items() 等进行复制。我正在覆盖字典,但它应该先处理右侧,但这是一个理解,所以我不确定它是否在覆盖 self.status 之前先完成整个理解。它是在理解新的字典然后设置它的同时在内存中存储一种副本,还是在每次迭代后循环理解和设置项目的字典(这是我认为会出现问题的地方)?
这将完全按照您描述的原因工作:右侧理解创建一个新词典并在 self.status
设置为它之前完成。
是的,这行得通。在 Python 中,变量是引用,因此您在右侧创建一个新字典,然后一步将其分配给 self.status
,不留任何空间读取和写入单个字典的运行时错误.