详谈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实现在windows下操作word的方法
Apr 28 Python
python 回调函数和回调方法的实现分析
Mar 23 Python
Python3中使用PyMongo的方法详解
Jul 28 Python
利用pandas将numpy数组导出生成excel的实例
Jun 14 Python
Python3的介绍、安装和命令行的认识(推荐)
Oct 20 Python
Python编程flask使用页面模版的方法
Dec 28 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
Jan 03 Python
python opencv将表格图片按照表格框线分割和识别
Oct 30 Python
对Tensorflow中Device实例的生成和管理详解
Feb 04 Python
Python netmiko模块的使用
Feb 14 Python
Python学习之路之pycharm的第一个项目搭建过程
Jun 18 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
Jul 13 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
Smarty模板简单配置与使用方法示例
2016/05/23 PHP
详解PHP发送邮件知识点
2018/05/06 PHP
window.onload追加函数使用示例
2014/03/03 Javascript
禁用JavaScript控制台调试的方法
2014/03/07 Javascript
编程语言JavaScript简介
2014/10/16 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
javascript实现简单的贪吃蛇游戏
2015/03/31 Javascript
Javascript实现的SHA-256加密算法完整实例
2016/02/02 Javascript
js滑动提示效果代码分享
2016/03/10 Javascript
JavaScript 数组中最大最小值
2016/06/05 Javascript
Javascript的比较汇总
2016/07/25 Javascript
Element UI 自定义正则表达式验证方法
2018/09/04 Javascript
一文读懂ES7中的javascript修饰器
2019/05/06 Javascript
微信小程序实现授权登录
2019/05/15 Javascript
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
一看就会的vuex实现登录验证(附案例)
2020/01/09 Javascript
Vue项目移动端滚动穿透问题的实现
2020/05/19 Javascript
浅要分析Python程序与C程序的结合使用
2015/04/07 Python
python如何查看系统网络流量的信息
2016/09/12 Python
浅谈Pandas 排序之后索引的问题
2018/06/07 Python
python 实现矩阵上下/左右翻转,转置的示例
2019/01/23 Python
从0开始的Python学习014面向对象编程(推荐)
2019/04/02 Python
解决pyecharts在jupyter notebook中使用报错问题
2020/04/23 Python
Django中template for如何使用方法
2021/01/31 Python
Python将QQ聊天记录生成词云的示例代码
2021/02/10 Python
使用python实现学生信息管理系统
2021/02/25 Python
微信端html5页面调用分享接口示例
2018/03/14 HTML / CSS
Deux par Deux官方网站:设计师童装
2020/01/03 全球购物
请介绍一下Ant
2016/07/22 面试题
linux面试题参考答案(7)
2014/07/24 面试题
乡镇三项教育实施方案
2014/03/30 职场文书
公务员学习习总书记“三严三实”思想汇报
2014/09/19 职场文书
2014年安置帮教工作总结
2014/12/11 职场文书
个人事迹材料范文
2014/12/29 职场文书
《少年闰土》教学反思
2016/02/18 职场文书
使用Nginx搭载rtmp直播服务器的方法
2021/10/16 Servers