详谈python3中用for循环删除列表中元素的坑
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循环删除列表中元素的坑就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
pyinstaller打包可执行文件,存放路径包含中文无法运行的解决方案
这篇文章主要介绍了pyinstaller打包可执行文件,存放路径包含中文无法运行的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2021-03-03Django restframework 源码分析之认证详解
这篇文章主要介绍了Django-restframework 源码分析之认证详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2019-02-02
最新评论