详谈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标准库urllib2的一些使用细节总结
Mar 16 Python
在Python中使用sort()方法进行排序的简单教程
May 21 Python
windows下ipython的安装与使用详解
Oct 20 Python
python3+mysql查询数据并通过邮件群发excel附件
Feb 24 Python
python 筛选数据集中列中value长度大于20的数据集方法
Jun 14 Python
Python初学者需要注意的事项小结(python2与python3)
Sep 26 Python
python使用pymongo操作mongo的完整步骤
Apr 13 Python
python导入坐标点的具体操作
May 10 Python
flask的orm框架SQLAlchemy查询实现解析
Dec 12 Python
PyTorch-GPU加速实例
Jun 23 Python
python中函数返回多个结果的实例方法
Dec 16 Python
浅谈pytorch中的dropout的概率p
May 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
星际争霸 Starcraft 编年史
2020/03/14 星际争霸
PHP数组排序之sort、asort与ksort用法实例
2014/09/08 PHP
php使用CURL伪造IP和来源实例详解
2015/01/15 PHP
php实现window平台的checkdnsrr函数
2015/05/27 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
javascript 支持ie和firefox杰奇翻页函数
2008/07/22 Javascript
Javascript 事件流和事件绑定
2009/07/16 Javascript
A标签触发onclick事件而不跳转的多种解决方法
2013/06/27 Javascript
JQuery实现简单的图片滑动切换特效
2015/11/22 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
AngularJS 中的事件详解
2016/07/28 Javascript
vue用addRoutes实现动态路由的示例
2017/09/15 Javascript
关于Google发布的JavaScript代码规范你要知道哪些
2018/04/04 Javascript
微信小程序实现聊天对话(文本、图片)功能
2018/07/06 Javascript
vue实现路由监听和参数监听
2019/10/29 Javascript
bootstrap-paginator服务器端分页使用方法详解
2020/02/13 Javascript
python多线程编程中的join函数使用心得
2014/09/02 Python
Python中设置变量作为默认值时容易遇到的错误
2015/04/03 Python
简单实现python进度条脚本
2017/12/18 Python
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
Python中list查询及所需时间计算操作示例
2018/06/21 Python
Django中的forms组件实例详解
2018/11/08 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
2019/05/13 Python
python集合的创建、添加及删除操作示例
2019/10/08 Python
Python迭代器模块itertools使用原理解析
2019/12/11 Python
pymysql 插入数据 转义处理方式
2020/03/02 Python
Python3实现飞机大战游戏
2020/04/24 Python
解决python中0x80072ee2错误的方法
2020/07/19 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
Html5自定义字体解决方法
2019/10/09 HTML / CSS
广告学专业自荐信范文
2014/02/24 职场文书
党员干部三严三实心得体会
2014/10/13 职场文书
2014年行政助理工作总结
2014/11/19 职场文书
黑白记忆观后感
2015/06/18 职场文书
Java9新特性对HTTP2协议支持与非阻塞HTTP API
2022/03/16 Java/Android
关于EntityWrapper的in用法
2022/03/22 Java/Android