欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > python >内容正文

python

Python for in 问题

发布时间:2025/4/16 python 0 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Python for in 问题 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

前几天学习群中有朋友问了一个奇怪的问题:

l = [1, 2, 3, 4, 5, 6] for v in l:del l[0] print(l) # [4, 5, 6]l = [1, 2, 3, 4, 5, 6] for v in l[:]:del l[0] print(l) # [] 复制代码

刚看到也是觉得奇怪,平时很少会在for in 遍历时删除列表元素,第二中写法和第一种写法上只是l和l[:]不同,为什么结果会那么奇怪? 先把影响结果的因素放在这里:

  • for in 遍历是触发可迭代对象的__iter__(),获取迭代器对象执行__next__()方法向后迭代列表
  • 列表是使用顺序表实现的,当删除前面的元素时,后面的元素会向前移动,补上前面的空值位置,而next的位置不变(后面通过画图解释)
  • l[:]是获取l的副本,属于浅拷贝,l[:]和l是两个不同的对象,所以当使用for in遍历l[:],是遍历的l[:],删除l中的元素不会影响对l[:]的迭代
  • 好了,下面一点一点看一下为什么会产生以上问题:

    for in 实现的while实现:

    l = [1, 2, 3, 4, 5, 6] for i in l:print(i)# 等价写法: i = 0 iter_l = iter(l) while True:try:print(next(iter_l))except StopIteration as e:print('迭代结束')break 复制代码

    迭代列表流程图

    当执行next方法时,返回当前元素,并移动到后一个元素位置,当当前位置无效时执行next方法就报错,结束循环

    那如果在遍历列表时同时删除元素,会如下图

    所以到会保留最后一半元素

    转载于:https://juejin.im/post/5aaf987a5188255565345121

    总结

    以上是生活随笔为你收集整理的Python for in 问题的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。