【问题标题】:dictionary changed size during iteration, after deepcopy, python字典在迭代过程中改变了大小,在深度复制之后,python
【发布时间】:2020-04-09 10:23:05
【问题描述】:

我有一个列表,我使用 deepcopy 复制了它。在上面的函数中,我有另一个列表,它也使用深层复制并按预期工作。虽然对于下面的代码,我得到一个 RuntimeError: dictionary changed size during iteration。不知道为什么会发生这种情况,因为我正在复制原始列表,然后在复制的列表上运行修改。数据对象是列表中的字典。


amdcount = 0
with open('amd3.json', 'r') as b:
    data = json.load(b)
    newlist.append(data)

copylist = copy.deepcopy(new_list)
for item in copylist:
    for k in item:
        if k == 'minute':
            item['test'] = 'test'
            print(k, item[k])

上面的代码在迭代过程中生成了一个 RuntimeError: dictionary changed size。

【问题讨论】:

    标签: python dictionary deep-copy


    【解决方案1】:

    当您执行 item['test'] = 'test' 时,您正在修改 item 字典,而您正在使用 for k in item: 对其进行迭代

    您可以使用list(item) 复制字典键:

    for k in list(item):
        if k == 'minute':
            item['test'] = 'test'
            print(k, item[k])
    

    不过,您根本不清楚为什么需要循环。它可以是

    if 'minute' in item:
        item['test'] = 'test'
        print('minute', item['minute'])
    

    【讨论】:

    • 甚至不需要内循环,效果相同:if 'minute' in item: item['test'] = 'test'; print('minute', item['minute'])
    • @DanD。我同意,但我认为这是对具有更多案例并且可能实际上需要循环的事物的简化。
    • 尽管它们可能只是多个 if 'xxx' in item: 测试。
    • 哪个更好:(a) for k in item.keys(): ... 或 (b) for k in list(item): ...?我认为item.keys() 更冗长。但是速度有区别吗?
    • 如果你使用item.keys(),你会得到同样的错误,因为它使用了一个生成器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2023-04-02
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多