发布于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__
作者:骏马
链接:https://www.pythonheidong.com/blog/article/232594/ea2e76a76ca3244a504f/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!