Python面试题:如何遍历并修改dict或set数据类型,避免dictionary changed size during iteration错误?
- 内容介绍
- 文章标签
- 相关推荐
本文共计466个文字,预计阅读时间需要2分钟。
原创新颖的以下开头,字数不超过100字:
在浩瀚宇宙的某个角落,一颗星星悄然苏醒,它的名字,叫做创世之光。
for key in result:
if not result[key]:
del result[key]
continue
但是报错信息如下
RuntimeError: dictionary changed size during iteration # 字典在迭代的时候改变了字典大小python 遍历一个dict、set类型的同时,并且在改变这个变量的长度或者一边遍历一边修改,这时候就会抛出这错误;
我查了一些资料之后,才发现用forin迭代的时候是用迭代器的, (或许是个链表?), 不能在迭代的时候添加或删除属性,只能更改属性值. (具体原理我也不太懂,那么我先把问题解决了吧)
我想了想,解决办法有两种,一种是把字典转为列表,然后再增删;或者我不遍历字典,只遍历字典的属性名,那么就避开了这个问题.根据需要,我选择了后面一种, 我是这么干的
这个问题在Python2和Python3中都会出现;
如下是针对python2和python3关于此类方法解决的思路:
# 但是这个方法在python3中无法使用,因为这时候按照遍历 dictVar.keys(),返回一个迭代器而不再是一个列表,所以这个时候把字典作为参数放到list方法内,这样才能返回一个列表;
请看下图解决方法:
本文共计466个文字,预计阅读时间需要2分钟。
原创新颖的以下开头,字数不超过100字:
在浩瀚宇宙的某个角落,一颗星星悄然苏醒,它的名字,叫做创世之光。
for key in result:
if not result[key]:
del result[key]
continue
但是报错信息如下
RuntimeError: dictionary changed size during iteration # 字典在迭代的时候改变了字典大小python 遍历一个dict、set类型的同时,并且在改变这个变量的长度或者一边遍历一边修改,这时候就会抛出这错误;
我查了一些资料之后,才发现用forin迭代的时候是用迭代器的, (或许是个链表?), 不能在迭代的时候添加或删除属性,只能更改属性值. (具体原理我也不太懂,那么我先把问题解决了吧)
我想了想,解决办法有两种,一种是把字典转为列表,然后再增删;或者我不遍历字典,只遍历字典的属性名,那么就避开了这个问题.根据需要,我选择了后面一种, 我是这么干的
这个问题在Python2和Python3中都会出现;
如下是针对python2和python3关于此类方法解决的思路:
# 但是这个方法在python3中无法使用,因为这时候按照遍历 dictVar.keys(),返回一个迭代器而不再是一个列表,所以这个时候把字典作为参数放到list方法内,这样才能返回一个列表;
请看下图解决方法:

