我正在编写代码,通过选择删除字典中的某些项,甚至使用字典的副本来防止在迭代过程中更改字典的大小,但我一直收到以下错误:
“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)发布于 2019-07-24 14:04:29
这要归功于你的copy。实际上,它只是一个shallow copy。从医生那里:
浅拷贝构造一个新的复合对象,然后(尽可能)将对原始对象的引用插入其中。
因此,当你浅层复制字典时,它仍然有对原始词典的引用。您将看到这一点,如果在错误后打印出word,您会注意到元素已被删除。
相反,您需要一个deep copy。又一次从医生那里:
深度复制构造一个新的复合对象,然后递归地将原始对象中的副本插入其中。
如果替换行,则可以避免错误:
wordCopy = copy.copy(word)
通过以下方式:
wordCopy = copy.deepcopy(word)
我还建议你充分阅读复印文档。
发布于 2019-07-24 14:19:38
您的wordCopy与word是分开的,但是wordCopy[item]是与word[item]相同的对象,因为copy.copy是一个浅拷贝。
您可以进行深度复制,或者只创建一个新的空对象,在倒排的情况下插入需要保留的项,而不修改原始的word。
https://stackoverflow.com/questions/57184351
复制相似问题