详谈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在linux中输出带颜色的文字的方法
Jun 19 Python
零基础写python爬虫之爬虫编写全记录
Nov 06 Python
Python中几种操作字符串的方法的介绍
Apr 09 Python
Python实现Logger打印功能的方法详解
Sep 01 Python
python中的内置函数max()和min()及mas()函数的高级用法
Mar 29 Python
点球小游戏python脚本
May 22 Python
python正则表达式去除两个特殊字符间的内容方法
Dec 24 Python
Python Handler处理器和自定义Opener原理详解
Mar 05 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
Mar 08 Python
Jupyter Notebook添加代码自动补全功能的实现
Jan 07 Python
python如何做代码性能分析
Apr 26 Python
如何将numpy二维数组中的np.nan值替换为指定的值
May 14 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
彻底删除thinkphp3.1案例blog标签的方法
2014/12/05 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
PHP htmlspecialchars()函数用法与实例讲解
2019/03/08 PHP
再探JavaScript作用域
2014/09/24 Javascript
JavaScript提升性能的常用技巧总结【经典】
2016/06/20 Javascript
jquery中绑定事件的异同
2017/02/28 Javascript
js,jq,css多方面实现简易下拉菜单功能
2017/05/13 Javascript
Js中async/await的执行顺序详解
2017/09/22 Javascript
手动用webpack搭建第一个ReactApp的示例
2018/04/11 Javascript
Javascript中弹窗confirm与prompt的区别
2018/10/26 Javascript
python使用epoll实现服务端的方法
2018/10/16 Python
使用50行Python代码从零开始实现一个AI平衡小游戏
2018/11/21 Python
python3利用ctypes传入一个字符串类型的列表方法
2019/02/12 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
2019/07/03 Python
python批量读取文件名并写入txt文件中
2020/09/05 Python
Numpy中对向量、矩阵的使用详解
2019/10/29 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
2019/10/30 Python
CSS3 实现弹幕的示例代码
2017/08/07 HTML / CSS
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
2018/01/03 HTML / CSS
用HTML5 实现橡皮擦的涂抹效果的教程
2015/05/11 HTML / CSS
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
当当网官方旗舰店:中国图书销售夺金品牌
2018/04/02 全球购物
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
教育孩子心得体会
2014/01/01 职场文书
酒店led欢迎词
2014/01/09 职场文书
实习单位接收函
2014/01/11 职场文书
前厅部经理岗位职责范文
2014/02/04 职场文书
小学生开学第一课活动方案
2014/03/27 职场文书
市场总监岗位职责
2015/02/11 职场文书
社区低保工作总结2015
2015/07/23 职场文书
二十年同学聚会感言
2015/07/30 职场文书
同学会感言
2015/07/30 职场文书
2016国庆节67周年寄语
2015/12/07 职场文书
《金色的草地》教学反思
2016/02/17 职场文书
在Windows下安装配置CPU版的PyTorch的方法
2021/04/02 Python