python-3.x - 迭代错误期间字典大小更改
问题描述
我正在编写代码以通过选择删除字典中的某些项目,甚至使用字典的副本来防止在迭代期间更改其大小,但我不断收到此错误:
'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)
解决方案
这是由于您的copy
. 它实际上只是一个shallow copy
. 从文档:
浅拷贝构造一个新的复合对象,然后(尽可能)将引用插入到原始对象中。
因此,当您浅拷贝字典时,它仍然引用原始字典。你会看到这一点,如果在你的错误之后打印出来,word
你会注意到一个元素已被删除。
相反,您需要一个deep copy
. 再次来自文档:
深拷贝构造一个新的复合对象,然后递归地将在原始对象中找到的对象的副本插入其中。
如果您替换该行,则可以避免错误:
wordCopy = copy.copy(word)
和:
wordCopy = copy.deepcopy(word)
我还建议您完整阅读文档副本。
推荐阅读
- python - 未找到模块错误:找不到office365
- python - 使用python计算每个相邻字符的出现
- spring - 未能在 Spring Webclient 上添加客户端凭据(clientid/clientsecret):请求处理失败 ... 401 UNAUTHORIZED
- java - 使用“RestTemplate restTemplate”了解@MockBean 的用法
- visual-studio-code - 我正在尝试运行一个 java 文件,该文件读取同一目录中的文本文件,但它说找不到该文件
- node.js - AWS Node JS kafka消费者解密kafka消息的代码示例
- python - Python中BeautifulSoup中的NoneType错误问题
- node.js - 开玩笑地多次模拟相同的方法
- wordpress - Wocomerce 将订单和订阅存储在数据库中的哪个位置?
- php - Nodejs在wordpress /getting 400错误和0中将帖子发送到admin-ajax.php