详谈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 optparse模块使用实例
Apr 09 Python
python简单的函数定义和用法实例
May 07 Python
Python常用知识点汇总
May 08 Python
浅谈python装饰器探究与参数的领取
Dec 01 Python
python实现反转部分单向链表
Sep 27 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
Dec 05 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
Jun 21 Python
Python 实现数据结构-堆栈和队列的操作方法
Jul 17 Python
使用python实现kNN分类算法
Oct 16 Python
Django 解决新建表删除后无法重新创建等问题
May 21 Python
初学者学习Python好还是Java好
May 26 Python
python分布式爬虫中消息队列知识点详解
Nov 26 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批量生成缩略图的代码
2008/07/19 PHP
PHP编程实现脚本异步执行的方法
2017/08/09 PHP
PHP文字转图片功能原理与实现方法分析
2017/08/31 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
Mootools 1.2教程 正则表达式
2009/09/15 Javascript
js给onclick赋值传参数的两种方法
2013/11/25 Javascript
jQuery使用prepend()方法在元素前添加内容用法实例
2015/03/26 Javascript
JS实现可拖曳、可关闭的弹窗效果
2015/09/26 Javascript
基于javascript实现简单的抽奖系统
2020/04/15 Javascript
详解JavaScript的另类写法
2016/04/11 Javascript
基于AGS JS开发自定义贴图图层
2017/03/31 Javascript
VueRouter导航守卫用法详解
2017/12/25 Javascript
基于vue监听滚动事件实现锚点链接平滑滚动的方法
2018/01/17 Javascript
AngularJS $http post 传递参数数据的方法
2018/10/09 Javascript
vue实现循环切换动画
2018/10/17 Javascript
jQuery 操作 HTML 元素和属性的方法
2018/11/12 jQuery
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
2019/05/09 Javascript
js实现淘宝首页的banner栏效果
2019/11/26 Javascript
Vue中强制组件重新渲染的正确方法
2021/01/03 Vue.js
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
[46:53]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python内置函数的用法实例教程
2014/09/08 Python
python字符串编码识别模块chardet简单应用
2015/06/15 Python
Python实现打印螺旋矩阵功能的方法
2017/11/21 Python
Python协程 yield与协程greenlet简单用法示例
2019/11/22 Python
利用python3 的pygame模块实现塔防游戏
2019/12/30 Python
使用Python提取文本中含有特定字符串的方法示例
2020/12/09 Python
就业自荐书
2013/12/05 职场文书
编辑找工作求职信范文
2013/12/16 职场文书
2014年幼儿园元旦活动方案
2014/02/13 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
发展党员工作情况汇报
2014/10/28 职场文书
对外汉语教师推荐信
2015/03/27 职场文书
2015入党自传书范文
2015/06/26 职场文书
2019旅游导游工作总结
2019/06/27 职场文书
Oracle11g r2 卸载干净重装的详细教程(亲测有效已重装过)
2021/06/04 Oracle