python for循环异常

一、疑难杂症

在这里插入图片描述
  写工具代码时遇到的问题,简化一下如上图片所示。根据a1剔除a2内的元素,结果输出了一个没剔除干净的a2。顿时陷入迷茫。于是,决定一探究竟。

二、探寻原因

  此前一直以为,执行for循环时,会把所有元素一次性放入循环体,后续不再动态的每一次都访问可迭代对象。
首先,我们来解析一下for循环的执行过程。执行for循环时,主要有一下三个步骤:
1)调用内置函数iter()函数获得一个迭代器
2)重复调用内置函数next()函数从上一个步骤里的迭代器中获取元素
3)当遇到StopIteration异常时,退出循环。
  所以,到这里问题就明显了,for循环先把可迭代对象转化为迭代器,再调用next()方法去逐一取出迭代器的元素。我们只要搞清楚next()函数的运行原理就可以知道上述问题出现的原因了。
查找python内置函数next的细节可以发现:
在这里插入图片描述
  其实,next调用了迭代器的__next__方法。而__next__是使用index去取出迭代器中的元素。所以,当执行过程中改变原来列表的元素,增加或者删除都会导致元素位置发生变化,后移或者迁移,使得一些元素得不到正确处理。
  根据以上原理,也不可使用for i in range(len(a2))这种方式操作

三、解决方法

1、可以将原来列表复制一份操作
2、可以将需要的元素放入新的一个列表

  参考:
  https://realpython.com/python-for-loop/
  https://docs.python.org/zh-cn/3.7/library/stdtypes.html#iterator.__next__
发布了25 篇原创文章 · 获赞 14 · 访问量 1157

猜你喜欢

转载自blog.csdn.net/A_pinkpig/article/details/104435469