详谈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自动化测试之连接几组测试包实例
Sep 28 Python
使用C语言扩展Python程序的简单入门指引
Apr 14 Python
Python如何生成树形图案
Jan 03 Python
python实现对求解最长回文子串的动态规划算法
Jun 02 Python
python删除字符串中指定字符的方法
Aug 13 Python
Python 实现微信防撤回功能
Apr 29 Python
django认证系统 Authentication使用详解
Jul 22 Python
python shutil文件操作工具使用实例分析
Dec 25 Python
tensorflow tf.train.batch之数据批量读取方式
Jan 20 Python
python如何通过twisted搭建socket服务
Feb 03 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
Feb 17 Python
Python datetime 格式化 明天,昨天实例
Mar 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
PHP 生成N个不重复的随机数
2015/01/21 PHP
PHP输出两个数字中间有多少个回文数的方法
2015/03/23 PHP
PHP封装的Twitter访问类实例
2015/07/18 PHP
php递归函数三种实现方法及如何实现数字累加
2015/08/07 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
2007/07/21 Javascript
nodejs下打包模块archiver详解
2014/12/03 NodeJs
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
Lua表达式和控制结构学习笔记
2014/12/15 Javascript
整理AngularJS中的一些常用指令
2015/06/16 Javascript
javascript常用的方法整理
2015/08/20 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
2015/08/24 Javascript
jQuery使用zTree插件实现树形菜单和异步加载
2016/02/25 Javascript
易被忽视的js事件问题总结
2016/05/14 Javascript
用JS实现图片轮播效果代码(一)
2016/06/26 Javascript
jQuery实现打开页面渐现效果示例
2016/07/27 Javascript
Bootstrap模态框禁用空白处点击关闭
2016/10/20 Javascript
微信小程序开发的四十个技术窍门总结(推荐)
2017/01/23 Javascript
浅谈JavaScript中的属性:如何遍历属性
2017/09/14 Javascript
JavaScript canvas实现围绕旋转动画
2017/11/18 Javascript
浅谈HTTP 缓存的那些事儿
2018/10/17 Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
2018/12/03 Javascript
Vue解决移动端弹窗滚动穿透问题
2020/12/15 Vue.js
Python利用字典将两个通讯录文本合并为一个文本实例
2018/01/16 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
Python使用googletrans报错的解决方法
2018/09/25 Python
python3.6下Numpy库下载与安装图文教程
2019/04/02 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
2019/07/12 Python
pytorch 模拟关系拟合——回归实例
2020/01/14 Python
Python 实现加密过的PDF文件转WORD格式
2020/02/04 Python
Python操作Excel的学习笔记
2021/02/18 Python
CSS3样式linear-gradient的使用实例
2017/01/16 HTML / CSS
用css3实现转换过渡和动画效果
2020/03/13 HTML / CSS
个性与发展自我评价
2014/02/11 职场文书
项目投资建议书
2014/05/16 职场文书
白酒营销策划方案
2014/08/17 职场文书