详谈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正则分组的应用
Nov 10 Python
Python操作列表的常用方法分享
Feb 13 Python
Python引用(import)文件夹下的py文件的方法
Aug 26 Python
Python遍历目录并批量更换文件名和目录名的方法
Sep 19 Python
Python批处理删除和重命名文件夹的实例
Jul 11 Python
python实现逐个读取txt字符并修改
Dec 24 Python
在python 不同时区之间的差值与转换方法
Jan 14 Python
Python3.5内置模块之time与datetime模块用法实例分析
Apr 27 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 Python
python3中pip3安装出错,找不到SSL的解决方式
Dec 12 Python
windows支持哪个版本的python
Jul 03 Python
pytorch损失反向传播后梯度为none的问题
May 12 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下通过系统信号量加锁方式获取递增序列ID
2009/09/25 PHP
ajax+php打造进度条 readyState各状态
2010/03/20 PHP
PHP中iconv函数转码时截断字符问题的解决方法
2015/01/21 PHP
Laravel用户授权系统的使用方法示例
2018/09/16 PHP
YII框架http缓存操作示例
2019/04/29 PHP
在页面上点击任一链接时触发一个事件的代码
2007/04/07 Javascript
javascript之Partial Application学习
2013/01/10 Javascript
用jquery生成二级菜单的实例代码
2013/06/24 Javascript
jQuery实现简洁的导航菜单效果
2015/11/23 Javascript
基于jQuery实现select下拉选择可输入附源码下载
2016/02/03 Javascript
Vue计算属性的学习笔记
2017/03/22 Javascript
js获取指定时间的前几秒
2017/04/05 Javascript
利用JS做网页特效_大图轮播(实例讲解)
2017/08/09 Javascript
深入理解ES6学习笔记之块级作用域绑定
2017/08/19 Javascript
JS实现的透明度渐变动画效果示例
2018/04/28 Javascript
说说node中的可读流和可写流的区别
2018/06/01 Javascript
JavaScript代码调试方法实例小结
2019/01/05 Javascript
jQuery鼠标滑过横向时间轴样式(代码详解)
2019/11/01 jQuery
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
2020/11/09 Javascript
Js利用正则表达式去除字符串的中括号
2020/11/23 Javascript
[01:03:38]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS CIS
2014/05/22 DOTA
常用python数据类型转换函数总结
2014/03/11 Python
深入理解Python中的元类(metaclass)
2015/02/14 Python
Python使用tablib生成excel文件的简单实现方法
2016/03/16 Python
详解基于python的多张不同宽高图片拼接成大图
2019/09/26 Python
python求绝对值的三种方法小结
2019/12/04 Python
python filecmp.dircmp实现递归比对两个目录的方法
2020/05/22 Python
Django执行源生mysql语句实现过程解析
2020/11/12 Python
摩飞电器俄罗斯官方网站:Morphy Richards俄罗斯
2020/07/30 全球购物
化工工艺专业求职信
2013/09/22 职场文书
学年自我鉴定
2014/01/16 职场文书
房产买卖委托公证书
2014/04/04 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
合作意向书范本
2019/04/17 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
Python OpenCV 彩色与灰度图像的转换实现
2021/06/05 Python