首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代误差中字典大小的变化

迭代误差中字典大小的变化
EN

Stack Overflow用户
提问于 2019-07-24 13:40:13
回答 2查看 105关注 0票数 1

我正在编写代码,通过选择删除字典中的某些项,甚至使用字典的副本来防止在迭代过程中更改字典的大小,但我一直收到以下错误:

“RuntimeError:字典在迭代过程中更改大小”

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-24 14:04:29

这要归功于你的copy。实际上,它只是一个shallow copy。从医生那里:

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

因此,当你浅层复制字典时,它仍然有对原始词典的引用。您将看到这一点,如果在错误后打印出word,您会注意到元素已被删除。

相反,您需要一个deep copy。又一次从医生那里:

深度复制构造一个新的复合对象,然后递归地将原始对象中的副本插入其中。

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

wordCopy = copy.copy(word)

通过以下方式:

wordCopy = copy.deepcopy(word)

我还建议你充分阅读复印文档

票数 2
EN

Stack Overflow用户

发布于 2019-07-24 14:19:38

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

您可以进行深度复制,或者只创建一个新的空对象,在倒排的情况下插入需要保留的项,而不修改原始的word

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57184351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档