详谈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中装饰器的用法
Apr 27 Python
Python读写ini文件的方法
May 28 Python
Python中取整的几种方法小结
Jan 06 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
Jun 20 Python
Python实现的文本对比报告生成工具示例
May 22 Python
Django使用中间键实现csrf认证详解
Jul 22 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
Jan 03 Python
Python实现链表反转的方法分析【迭代法与递归法】
Feb 22 Python
PyCharm永久激活方式(推荐)
Sep 22 Python
Django与pyecharts结合的实例代码
May 13 Python
python读取hdfs上的parquet文件方式
Jun 06 Python
Python 全局空间和局部空间
Apr 06 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
初学PHP的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
PHP的可变变量名的使用方法分享
2012/02/05 PHP
几个有用的php字符串过滤,转换函数代码
2012/05/01 PHP
yii2.0实现pathinfo的形式访问的配置方法
2016/04/06 PHP
PHP表单验证内容是否为空的实现代码
2016/11/14 PHP
jquery DOM操作 基于命令改变页面
2010/05/06 Javascript
JS等比例缩小图片尺寸的实例
2013/02/27 Javascript
javascript验证身份证号
2015/03/03 Javascript
javascript获取当前的时间戳的方法汇总
2015/07/26 Javascript
javascript实现数组中的内容随机输出
2015/08/11 Javascript
React复制到剪贴板的示例代码
2017/08/22 Javascript
vue.js  父向子组件传参的实例代码
2017/10/29 Javascript
浅谈Webpack自动化构建实践指南
2017/12/18 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
layUI使用layer.open,在content打开数据表格,获取值并返回的方法
2019/09/26 Javascript
推荐几个不错的console调试技巧实现
2019/12/20 Javascript
jquery实现的放大镜效果示例
2020/02/24 jQuery
[09:43]DOTA2每周TOP10 精彩击杀集锦vol.5
2014/06/25 DOTA
Python 命令行非阻塞输入的小例子
2013/09/27 Python
初步理解Python进程的信号通讯
2015/04/09 Python
python计算日期之间的放假日期
2018/06/05 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
python实现输入的数据在地图上生成热力图效果
2019/12/06 Python
Python属性和内建属性实例解析
2020/01/14 Python
对tensorflow中cifar-10文档的Read操作详解
2020/02/10 Python
css3 给背景设置渐变色的方法
2019/09/12 HTML / CSS
德国EGOIST网店:销售畅销的设计师品牌
2017/04/18 全球购物
纪伊国屋新加坡网上书店:Kinokuniya新加坡
2017/12/29 全球购物
Gap英国官网:Gap UK
2018/07/18 全球购物
安全生产活动月方案
2014/03/09 职场文书
食品采购员岗位职责
2014/04/14 职场文书
组织鉴定材料
2014/06/02 职场文书
教师师德师风个人整改方案
2014/09/18 职场文书
2014领导干部学习焦裕禄同志先进事迹思想汇报
2014/09/19 职场文书
结婚喜宴迎宾词
2015/08/10 职场文书
2019下半年英语教师的教学工作计划(3篇)
2019/09/25 职场文书