详谈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安装pywin32clipboard的操作方法
Jan 24 Python
Python 给屏幕打印信息加上颜色的实现方法
Apr 24 Python
聊聊python里如何用Borg pattern实现的单例模式
Jun 06 Python
Python定义函数时参数有默认值问题解决
Dec 19 Python
python 串口读取+存储+输出处理实例
Dec 26 Python
通过python连接Linux命令行代码实例
Feb 18 Python
python读取文件指定行内容实例讲解
Mar 02 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
May 11 Python
Python logging模块写入中文出现乱码
May 21 Python
Selenium及python实现滚动操作多种方法
Jul 21 Python
最简单的matplotlib安装教程(小白)
Jul 28 Python
python开发人人对战的五子棋小游戏
May 02 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
解决cPanel无法安装php5.2.17
2014/06/22 PHP
PHP生成等比缩略图类和自定义函数分享
2014/06/25 PHP
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
分享3个php获取日历的函数
2015/09/25 PHP
php获取指定数量随机字符串的方法
2017/02/06 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
JavaScript实现向右伸出的多级网页菜单效果
2015/08/25 Javascript
两种方法解决javascript url post 特殊字符转义 + &amp; #
2016/04/13 Javascript
JavaScript中创建对象的模式汇总
2016/04/19 Javascript
JavaScript实现倒计时跳转页面功能【实用】
2016/12/13 Javascript
js date 格式化
2017/02/15 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
2017/11/10 Javascript
Node.js使用MySQL连接池的方法实例
2018/02/11 Javascript
如何用webpack4带你实现一个vue的打包的项目
2018/06/20 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
mpvue全局引入sass文件的方法步骤
2019/03/06 Javascript
微信小程序实现时间进度条功能
2020/11/17 Javascript
详解JavaScript类型判断的四种方法
2020/10/21 Javascript
linux系统使用python获取内存使用信息脚本分享
2014/01/15 Python
python简单判断序列是否为空的方法
2015/06/30 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
2018/01/31 Python
搭建python django虚拟环境完整步骤详解
2019/07/08 Python
学习和使用python的13个理由
2019/07/30 Python
如何从csv文件构建Tensorflow的数据集
2020/09/21 Python
Wojas罗马尼亚网站:波兰皮鞋品牌
2018/11/01 全球购物
一套Delphi的笔试题一
2016/02/14 面试题
快递业务员岗位职责
2014/01/06 职场文书
化妆师职业生涯规划书
2014/02/16 职场文书
授权委托书样本及填写说明
2014/09/19 职场文书
乡党委干部党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
党员组织生活会发言材料
2014/10/17 职场文书
自主招生推荐信格式模板
2015/03/24 职场文书
学校2016年圣诞节活动总结
2016/03/31 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
MySQL图形化管理工具Navicat安装步骤
2021/12/04 MySQL