【问题标题】:Dictionary Size Change During Iteration Error迭代错误期间字典大小更改
【发布时间】:2019-12-02 16:36:38
【问题描述】:

我正在编写代码以通过选择删除字典中的某些项目,甚至使用字典的副本来防止在迭代期间更改其大小,但我不断收到此错误:

'RuntimeError: 迭代期间字典大小改变'

import copy
word = {'a':{'aa':{'aaa', 'aab'}, \
             'ab':{'aaa', 'aab'}}, \
        'b':{'ba':{'aaa', 'aab'}, \
             'bb':{'aaa', 'aab'}}, \
        'c':{'ca':{'aaa', 'aab'}, \
             'cb':{'aaa', 'aab'}}}
wordCopy = copy.copy(word)
for item in word.keys():
    for k in word[item].keys():
        print(k)
        print('Enter del to delete this item:')
        deleteCertificate = input()
        if deleteCertificate == 'del':
            del wordCopy[item][k]
word = wordCopy
print(word)

【问题讨论】:

    标签: python-3.x dictionary iteration deep-copy shallow-copy


    【解决方案1】:

    这是由于您的copy。它实际上只是一个shallow copy。来自文档:

    浅拷贝构造一个新的复合对象,然后(在可能的范围内)将引用插入到原始对象中。

    所以当你浅拷贝字典时,它仍然有对原始字典的引用。你会看到这一点,如果在你的错误之后打印出word,你会注意到一个元素已被删除。

    相反,您需要deep copy。再次来自文档:

    深拷贝构造一个新的复合对象,然后递归地将在原始对象中找到的对象的副本插入其中。

    如果您更换该行,您可以避免错误:

    wordCopy = copy.copy(word)

    与:

    wordCopy = copy.deepcopy(word)

    我还建议您完整阅读docs on copy

    【讨论】:

      【解决方案2】:

      您的wordCopyword 是分开的,但wordCopy[item]word[item] 是同一个对象,因为copy.copy 是一个浅拷贝。

      你可以做一个深拷贝,或者你可以只创建一个新的空对象,并在倒置条件下插入需要保留的项目,根本不修改原始word

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-21
        • 2023-04-02
        • 2021-07-05
        • 1970-01-01
        相关资源
        最近更新 更多