首页 > 解决方案 > 迭代错误期间字典大小更改

问题描述

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

'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.xdictionaryiterationdeep-copyshallow-copy

解决方案


这是由于您的copy. 它实际上只是一个shallow copy. 从文档:

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

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

相反,您需要一个deep copy. 再次来自文档:

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

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

wordCopy = copy.copy(word)

和:

wordCopy = copy.deepcopy(word)

我还建议您完整阅读文档副本


推荐阅读