详谈python3中用for循环删除列表中元素的坑


Posted in Python onApril 19, 2018

for循环语句的对象是可迭代对象,可迭代对象需要实现__iter__或iter方法,并返回一个迭代器,什么是迭代器呢?迭代器只需要实现 __next__或next方法。

现在来验证一下列表为什么支持迭代:

x = [1,2,3]
its = iter(x)
# its = x.__iter__()
print(type(its))
# print(its.__next__())
# print(its.__next__())
# print(its.__next__())
print(next(its))
print(next(its))
print(next(its))

结果:

<class 'list_iterator'>
1
2
3

for 语句如何循环的呢?步骤是:

(1)先判断对象是否为可迭代对象,不是的话直接报错,抛出TypeError异常,是的话,调用 __iter__或iter方法,返回一个迭代器

(2)不断地调用迭代器的__next__或next方法,每次按序返回迭代器中的一个值

(3)迭代到最后,没有更多元素了,就抛出异常 StopIteration,这个异常 python 自己会处理,不会暴露给开发者

list1 = [1,2,3,4,5,6]
for i in list1:
 if i == 2:
  list1.remove(i)
 print(i)
print(list1)

结果:

1
2
4
5
6
[1, 3, 4, 5, 6]

第二个print打印的结果显然是删除了元素2的列表,第一个print为什么没有3呢?因为执行for语句时,先生成一个迭代器,再用next方法,按序返回迭代器中的值,当列表中删除了元素2时,元素3的索引变成了原来元素2的索引,把元素3往前推到了元素2的位置,所以next方法就没返回值3.在python中,使用iter函数可以获得有序聚合类型的迭代器,我个人将迭代器理解为带有next指针的单向链表,获取到的迭代器为链表的表头,表头内容为空,next指针指向有序聚合类型的第一个元素。

在访问链表最后一个元素的next指针时,python会报错StopIteration。

以上这篇详谈python3中用for循环删除列表中元素的坑就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python生成随机mac地址的方法
Mar 16 Python
使用IPython下的Net-SNMP来管理类UNIX系统的教程
Apr 15 Python
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
Apr 25 Python
详解Python文件修改的两种方式
Aug 22 Python
python常用排序算法的实现代码
Nov 08 Python
PyCharm使用之配置SSH Interpreter的方法步骤
Dec 26 Python
Python&amp;&amp;GDAL实现NDVI的计算方式
Jan 09 Python
在python里使用await关键字来等另外一个协程的实例
May 04 Python
Django多层嵌套ManyToMany字段ORM操作详解
May 19 Python
python Cartopy的基础使用详解
Nov 01 Python
python绘制高斯曲线
Feb 19 Python
Python实现Telnet自动连接检测密码的示例
Apr 16 Python
PyQt5每天必学之关闭窗口
Apr 19 #Python
python实现在IDLE中输入多行的方法
Apr 19 #Python
python贪婪匹配以及多行匹配的实例讲解
Apr 19 #Python
PyQt5每天必学之工具提示功能
Apr 19 #Python
PyQt5每天必学之QSplitter实现窗口分隔
Apr 19 #Python
python 读入多行数据的实例
Apr 19 #Python
Python 绘图库 Matplotlib 入门教程
Apr 19 #Python
You might like
zend Framework中的Layout(模块化得布局)详解
2013/06/28 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
alixixi runcode.asp的代码不错的应用
2007/08/08 Javascript
javascript alert乱码的解决方法
2013/11/05 Javascript
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
js获取时间精确到秒(年月日)
2016/03/16 Javascript
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
2016/05/03 Javascript
AngularJS ng-bind-html 指令详解及实例代码
2016/07/30 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
通过BootStrap实现轮播图的实际应用
2016/09/26 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
2017/03/02 Javascript
微信小程序 连续旋转动画(this.animation.rotate)详解
2017/04/07 Javascript
jQuery操作之效果详解
2017/05/19 jQuery
React-router v4 路由配置方法小结
2017/08/08 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
2018/12/14 Javascript
Vue学习笔记之计算属性与侦听器用法
2019/12/07 Javascript
微信小程序scroll-view点击项自动居中效果的实现
2020/03/25 Javascript
Javascript异步编程async实现过程详解
2020/04/02 Javascript
vue 扩展现有组件的操作
2020/08/14 Javascript
Python程序设计入门(4)模块和包
2014/06/16 Python
Python单元测试框架unittest简明使用实例
2015/04/13 Python
Python基于动态规划算法计算单词距离
2015/07/25 Python
通过python实现弹窗广告拦截过程详解
2019/07/10 Python
解决Django后台ManyToManyField显示成Object的问题
2019/08/09 Python
python 利用toapi库自动生成api
2020/10/19 Python
基于Python的接口自动化读写excel文件的方法
2021/01/15 Python
init进程的作用
2012/04/12 面试题
应届大专毕业生个人自荐信
2013/09/22 职场文书
医学生职业规划范文
2014/01/05 职场文书
测试工程师程序员求职信范文
2014/02/20 职场文书
搞笑的获奖感言
2014/08/16 职场文书
干部对照检查材料范文
2014/08/26 职场文书
世界红十字日活动总结
2015/02/10 职场文书
繁星春水读书笔记
2015/06/30 职场文书
创业计划书之溜冰场
2019/10/25 职场文书