详谈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系列之数据处理编程实例(一)
May 22 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
Nov 21 Python
举例讲解Python中的算数运算符的用法
May 13 Python
Python3读取文件常用方法实例分析
May 22 Python
Python中pygame安装方法图文详解
Nov 11 Python
opencv python 图像去噪的实现方法
Aug 31 Python
在pycharm 中添加运行参数的操作方法
Jan 19 Python
Python3.5迭代器与生成器用法实例分析
Apr 30 Python
详解Matplotlib绘图之属性设置
Aug 23 Python
详解python tkinter模块安装过程
Jan 06 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
Jul 20 Python
Python中的pprint模块
Nov 27 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字符串截取中文截取2,单字节截取模式
2007/12/10 PHP
简单解决新浪SAE无法上传文件的问题
2015/05/13 PHP
帝国cms目录结构分享
2015/07/06 PHP
Laravel+Intervention实现上传图片功能示例
2019/07/09 PHP
IE6/7/8/9不支持exec的简写方式
2011/05/25 Javascript
js实现网页自动刷新可制作节日倒计时效果
2014/05/27 Javascript
javascript Deferred和递归次数限制实例
2014/10/21 Javascript
jQuery制作简单柱状图实例
2015/01/28 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
2015/09/14 Javascript
window.open不被拦截的简单实现代码(推荐)
2016/08/04 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
2016/09/14 Javascript
JavaScript之Vue.js【入门基础】
2016/12/06 Javascript
Vue数据驱动模拟实现1
2017/01/11 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
jQuery实现div跟随鼠标移动
2020/08/20 jQuery
layui中layer前端组件实现图片显示功能的方法分析
2017/10/13 Javascript
Angular6 用户自定义标签开发的实现方法
2019/01/08 Javascript
JS中==、===你分清楚了吗
2020/03/04 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
vue-cli脚手架的.babelrc文件用法说明
2020/09/11 Javascript
Python的函数嵌套的使用方法
2014/01/24 Python
pygame学习笔记(1):矩形、圆型画图实例
2015/04/15 Python
python获取目录下所有文件的方法
2015/06/01 Python
python查找指定具有相同内容文件的方法
2015/06/28 Python
Python选课系统开发程序
2016/09/02 Python
python实现黑客字幕雨效果
2018/06/21 Python
工程专业应届生求职信
2014/02/19 职场文书
春风行动实施方案
2014/03/28 职场文书
单位工资证明范本
2015/06/12 职场文书
北京青年观后感
2015/06/15 职场文书
庆七一主持词
2015/06/29 职场文书
幼儿园师德师风心得体会
2016/01/12 职场文书
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
2021/05/14 Python
一次项目中Thinkphp绕过禁用函数的实战记录
2021/11/17 PHP
python中redis包操作数据库的教程
2022/04/19 Python