详谈python3中用for循环删除列表中元素的坑

 更新时间:2018年04月19日 10:43:24   作者:jimmy_gyn  
下面小编就为大家分享一篇详谈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循环删除列表中元素的坑就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python实现的远程登录windows系统功能示例

    Python实现的远程登录windows系统功能示例

    这篇文章主要介绍了Python实现的远程登录windows系统功能,结合实例形式分析了Python基于wmi模块的远程连接与进程操作相关实现技巧,需要的朋友可以参考下
    2018-06-06
  • Django错误:TypeError at / ''bool'' object is not callable解决

    Django错误:TypeError at / ''bool'' object is not callable解决

    这篇文章主要介绍了Django 错误:TypeError at / 'bool' object is not callable解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Python高阶函数之filter()函数代码示例

    Python高阶函数之filter()函数代码示例

    这篇文章主要介绍了Python高阶函数之filter()函数代码示例,获取了一个序列的时候,想要把一些内容去掉,保留一部分内容的时候可以使用高效的filter()函数,需要的朋友可以参考下
    2023-07-07
  • Python制作基础学生信息管理系统

    Python制作基础学生信息管理系统

    本文详细讲解了Python制作基础学生信息管理系统的实现,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • python使用MQTT给硬件传输图片的实现方法

    python使用MQTT给硬件传输图片的实现方法

    最近因需要用python写一个微服务来用MQTT给硬件传输图片,其中python用的是flask框架。这篇文章主要介绍了python使用MQTT给硬件传输图片,需要的朋友可以参考下
    2019-05-05
  • Django中提供的6种缓存方式详解

    Django中提供的6种缓存方式详解

    这篇文章主要介绍了Django中提供的6种缓存方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • python使用wxpy实现微信消息防撤回脚本

    python使用wxpy实现微信消息防撤回脚本

    这篇文章主要为大家详细介绍了python使用wxpy实现微信消息防撤回脚本,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • 如何实现Python调用Golang代码详解

    如何实现Python调用Golang代码详解

    这篇文章主要介绍了如何实现Python调用Golang代码,Python和Golang都是当下非常流行的编程语言,在实际开发中,我们可能会遇到需要将Python和Golang进行组合使用的场景,感兴趣想要详细了解可以参考下文
    2023-05-05
  • Python中常用操作字符串的函数与方法总结

    Python中常用操作字符串的函数与方法总结

    这篇文章主要介绍了Python中常用操作字符串的函数与方法总结,包括字符串的格式化输出与拼接等基础知识,需要的朋友可以参考下
    2016-02-02
  • Python 实现在文件中的每一行添加一个逗号

    Python 实现在文件中的每一行添加一个逗号

    下面小编就为大家分享一篇Python 实现在文件中的每一行添加一个逗号,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04

最新评论