程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

python for循环异常

发布于2020-02-24 22:43     阅读(866)     评论(0)     点赞(10)     收藏(2)


一、疑难杂症

在这里插入图片描述
    写工具代码时遇到的问题,简化一下如上图片所示。根据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__
  • 1
  • 2
  • 3
发布了2 篇原创文章 · 获赞 3 · 访问量 120


所属网站分类: 技术文章 > 博客

作者:骏马

链接:https://www.pythonheidong.com/blog/article/232594/ea2e76a76ca3244a504f/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

10 0
收藏该文
已收藏

评论内容:(最多支持255个字符)