【问题标题】:Python -- differences in how I mutate dictionaries in a for loopPython——我如何在 for 循环中改变字典的差异
【发布时间】:2015-06-25 23:10:01
【问题描述】:

我意识到在循环遍历字典时改变字典可能会导致运行时错误,但我知道有适当的方法可以做到这一点,但我不知道哪些是可接受的,哪些不是。控制台测试它们没有帮助,因为它们可能会产生运行时错误,我不确定我是正确还是幸运。

假设我有一个属性 status,它是一个状态字典:

self.status = {"overall": False, "started":False,
               "ready":False, "awakeQueried":False,
               "allQueried":False}

这些在整个运行过程中会更改为各种 True 或 False。我有一个处理失败的函数,并希望将它们全部设置为 False。优雅的方式是什么?到目前为止,我已经完成了这项工作,但我不确定是否会在某个时候遇到运行时错误:

self.status = {key:False for key in self.status}

我可以这样做吗?我不确定这里的低级功能。我不是用 .items() 或类似的东西制作副本。我正在覆盖字典,但它应该首先处理右侧,但它是一种理解,所以我不确定它是否在覆盖 self.status 之前先完成整个理解。它是在理解新字典然后设置它时在内存中存储一​​种副本,还是在每次迭代后循环理解和设置项目(这是我认为会出现问题的地方)?

【问题讨论】:

    标签: python dictionary iteration dictionary-comprehension


    【解决方案1】:

    这正是您描述的原因:右侧理解创建一个新字典并在 self.status 设置为它之前完成。

    【讨论】:

      【解决方案2】:

      是的,这会起作用。在 Python 中,变量是引用,因此您可以在右侧创建一个新字典,然后一步将其分配给 self.status,不会为读取和写入单个 dict 的运行时错误留下空间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-01
        • 2011-07-14
        • 2022-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多