码迷,mamicode.com
首页 > 编程语言 > 详细

Python面试题目之(针对dict或者set数据类型)边遍历 边修改 报错dictionary changed size during iteration

时间:2018-05-31 02:26:17      阅读:377      评论:0      收藏:0      [点我收藏+]

标签:无法   根据   alt   erro   数据类型   列表   类方法   python   图片   

 

    # result 是一个字典, 把里面属性值是None的属性删除  
    for key in result:  
        if not result[key]:  
            del result[key]  
            continue  

 

但是报错信息如下

技术分享图片

RuntimeError: dictionary changed size during iteration   # 字典在迭代的时候改变了字典大小 

 python 遍历一个dict、set类型的同时,并且在改变这个变量的长度或者一边遍历一边修改,这时候就会抛出这错误;

 我查了一些资料之后, 才发现用for in 迭代的时候是用迭代器的, (或许是个链表?), 不能在迭代的时候添加或删除属性, 只能更改属性值. (具体原理我也不太懂, 那么我先把问题解决了吧)

我想了想, 解决办法有两种, 一种是把字典转为列表, 然后再增删; 或者我不遍历字典, 只遍历字典的属性名, 那么就避开了这个问题.根据需要, 我选择了后面一种, 我是这么干的

这个问题在Python2和Python3中都会出现;

 

如下是针对python2和python3关于此类方法解决的思路:

 

# python2中遍历 dictVar.keys(),返回一个列表,从而得到一个列表,这样可以一边遍历列表一遍修改字典;

# 但是这个方法在python3中无法使用,因为这时候按照遍历 dictVar.keys(),返回一个迭代器而不再是一个列表,所以这个时候把字典作为参数放到list方法内,这样才能返回一个列表;

 

技术分享图片

 

请看下图解决方法:

技术分享图片

 

 

 

 

 

 

 

Python面试题目之(针对dict或者set数据类型)边遍历 边修改 报错dictionary changed size during iteration

标签:无法   根据   alt   erro   数据类型   列表   类方法   python   图片   

原文地址:https://www.cnblogs.com/JetpropelledSnake/p/9114206.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!