详谈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开发的小球完全弹性碰撞游戏代码
Oct 15 Python
Python时间戳与时间字符串互相转换实例代码
Nov 28 Python
实例解析Python设计模式编程之桥接模式的运用
Mar 02 Python
Python 自动化表单提交实例代码
Jun 08 Python
python操作excel的方法
Aug 16 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
Sep 17 Python
python下载微信公众号相关文章
Feb 26 Python
django中嵌套的try-except实例
May 21 Python
Python3基于plotly模块保存图片表格
Aug 03 Python
pytorch简介
Nov 11 Python
只用Python就可以制作的简单词云
Jun 07 Python
opencv深入浅出了解机器学习和深度学习
Mar 17 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
Jquery带搜索框的下拉菜单
2013/05/06 Javascript
在javascript中执行任意html代码的方法示例解读
2013/12/25 Javascript
Seajs的学习笔记
2014/03/04 Javascript
搭建pomelo 开发环境
2014/06/24 Javascript
Ajax中解析Json的两种方法对比分析
2015/06/25 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
2016/07/15 Javascript
Django1.7+JQuery+Ajax验证用户注册集成小例子
2017/04/08 jQuery
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
JS实现上传图片的三种方法并实现预览图片功能
2017/07/14 Javascript
深入理解Vue.js源码之事件机制
2017/09/27 Javascript
webpack css加载和图片加载的方法示例
2018/09/11 Javascript
vue在响应头response中获取自定义headers操作
2020/07/24 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
2020/09/07 Javascript
JavaScript 防盗链的原理以及破解方法
2020/12/29 Javascript
Python 列表(List)操作方法详解
2014/03/11 Python
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
Python+django实现简单的文件上传
2016/08/17 Python
浅谈django中的认证与登录
2016/10/31 Python
利用Python实现网络测试的脚本分享
2017/05/26 Python
利用Python进行数据可视化常见的9种方法!超实用!
2018/07/11 Python
python 动态迁移solr数据过程解析
2019/09/04 Python
pytorch常见的Tensor类型详解
2020/01/15 Python
Python使用Socket实现简单聊天程序
2020/02/28 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
2020/05/18 Python
Python select及selectors模块概念用法详解
2020/06/22 Python
爬虫代理的cookie如何生成运行
2020/09/22 Python
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
英国女性时尚品牌:Apricot
2018/12/04 全球购物
中专毕业生自荐信
2013/11/16 职场文书
广播体操比赛口号
2014/06/10 职场文书
开展批评与自我批评心得体会
2014/10/17 职场文书
医学生自荐信范文(2016精选篇)
2016/01/28 职场文书
初三英语教学反思
2016/02/15 职场文书
资深HR教你写好简历中的自我评价
2019/05/07 职场文书
python基础之错误和异常处理
2021/10/24 Python
Python实现视频中添加音频工具详解
2021/12/06 Python