• 技术文章 >后端开发 >Python教程

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

    不言不言2018-04-19 11:28:45原创1414
    下面为大家分享一篇详谈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。

    相关推荐:

    python list删除元素时要注意的坑点


    以上就是python3中用for循环删除列表中元素的坑的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:python3 表中 删除
    上一篇:PyQt5每天必学之关闭窗口 下一篇:python实现在IDLE中输入多行的方法
    20期PHP线上班

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• Python详细解析之二分查找算法• 一起聊聊python程序设计思想• 深入了解Python装饰器函数• python数据可视化之饼状图的绘制• Python图像处理之PIL库
    1/1

    PHP中文网