详谈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使用BeautifulSoup分页网页中超链接的方法
Apr 04 Python
python3批量删除豆瓣分组下的好友的实现代码
Jun 07 Python
Python导入模块时遇到的错误分析
Aug 30 Python
Python实现基本数据结构中栈的操作示例
Dec 04 Python
python之Flask实现简单登录功能的示例代码
Dec 24 Python
Django urls.py重构及参数传递详解
Jul 23 Python
使用Python调取任意数字资产钱包余额功能
Aug 15 Python
Python操作多维数组输出和矩阵运算示例
Nov 28 Python
python异常处理之try finally不报错的原因
May 18 Python
Django获取model中的字段名和字段的verbose_name方式
May 19 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
Jun 01 Python
python装饰器代码深入讲解
Mar 01 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 开发环境配置(Zend Server安装)
2010/04/28 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
js类中获取外部函数名的方法
2007/08/19 Javascript
JS实现多物体缓冲运动实例代码
2013/11/29 Javascript
js,jquery滚动/跳转页面到指定位置的实现思路
2014/06/03 Javascript
SuperSlide2实现图片滚动特效
2014/06/20 Javascript
Javascript中3种实现继承的方法和代码实例
2014/08/12 Javascript
jQuery插件bxSlider实现响应式焦点图
2015/04/12 Javascript
JavaScript实现简单图片翻转的方法
2015/04/17 Javascript
js控制网页前进和后退的方法
2015/06/08 Javascript
JS打字效果的动态菜单代码分享
2015/08/21 Javascript
node+experss实现爬取电影天堂爬虫
2016/11/20 Javascript
JS 终止执行的实现方法
2016/11/24 Javascript
JS中正则表达式全局匹配模式 /g用法详解
2017/04/01 Javascript
基于 webpack2 实现的多入口项目脚手架详解
2017/06/26 Javascript
vue项目常用组件和框架结构介绍
2017/12/24 Javascript
JS同步、异步、延迟加载的方法
2018/05/05 Javascript
微信小程序倒计时功能实例代码
2018/07/17 Javascript
世界上最短的数字判断js代码
2019/09/09 Javascript
通过实例解析vuejs如何实现调试代码
2020/07/16 Javascript
JS轮播图的实现方法2
2020/08/25 Javascript
[01:44]《为梦想出发》—联想杯DOTA2完美世界全国高校联赛
2015/09/30 DOTA
[05:13]2018DOTA2亚洲邀请赛主赛事第二日战况回顾 LGD、VG双雄携手晋级
2018/04/05 DOTA
Python对字符串实现去重操作的方法示例
2017/08/11 Python
Python中最大最小赋值小技巧(分享)
2017/12/23 Python
python多线程实现同时执行两个while循环的操作
2020/05/02 Python
加拿大健康、婴儿和美容产品在线购物:Well.ca
2016/11/30 全球购物
Pretty Little Thing美国:时尚女性服饰
2018/08/27 全球购物
Rentalcars.com中国:世界上最大的在线汽车租赁服务
2019/08/22 全球购物
美国家用和厨房电器销售网站:Appliances Connection
2020/01/24 全球购物
大型会议接待方案
2014/03/01 职场文书
幼儿园招生广告
2014/03/19 职场文书
党员群众路线对照检查材料思想汇报
2014/09/17 职场文书
入党自传范文2015
2015/06/26 职场文书
python绘制简单直方图(质量分布图)的方法
2022/04/21 Python
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js