AndyYoung 发表于 2020-5-26 22:11:05

关于遍历,为什么遍历不全

请教大家个问题:
为什么用for去遍历一个列表里的元素,并对列表元素处理时,不能遍历完整:

举例:

list_test =
for each in list_test:
        if each == 6:
                print("Six")


这样可以完成输出为
Six
Six
Six
这样的结果可以理解。

但是如果改成下面

list_test =
for each in list_test:
        if each == 6:
                list_test.remove(6)
                print("Six")
                print(list_test)


输出结果:
Six


明显没有遍历完整,后面两个6也没有移除。
这是为什么呢?
如果可以完成全部元素的遍历,和后面的移除操作(不仅是移除,可能还会涉及到其他的操作。)

Twilight6 发表于 2020-5-26 22:18:49

本帖最后由 Twilight6 于 2020-5-26 22:53 编辑

你输出结果错了,应该是两次:
Six

Six


原列表是指 :

因为你第一次遍历是按照 这个列表遍历的,然后遍历到第一个6时候,此时for指向的是原列表的第一个6

通过 remove移除一个 6得到列表 ,此时因为第一个6被移除了,第二个6就会往前进一位,所以for指向了原列表的第二个 6

再一次 for 遍历就是列表 而继续从下一个6 开始,也就是第三个6,所以通过remove 再次移除一个 6 导致列表变成,这时候for循环已经到结尾了,因为列表长度被你remove变短了

永恒的蓝色梦想 发表于 2020-5-26 22:30:02

楼上正解

_荟桐_ 发表于 2020-5-26 22:44:54

Twilight6 发表于 2020-5-26 22:39
对的 第一次遇到的6 和最后一次遇到的6

删除的应该就是第一个和第二个,我刚刚好像说错了{:10_250:}
因为代码里是remove(6),所以是从左往右找,然后就找到第一个和第二个六
到第三个的时候正好遍历完了

Twilight6 发表于 2020-5-26 22:45:42

本帖最后由 Twilight6 于 2020-5-26 22:54 编辑

_荟桐_ 发表于 2020-5-26 22:44
删除的应该就是第一个和第二个,我刚刚好像说错了
因为代码里是remove(6),所以是从左往右找 ...

对哦我也懵了 remove是按顺序的!

我之前是对的...被你误导下,我以为我错了,{:10_285:} 白白编辑了那么久,重新编辑了个错的,现在改回来了

看来知识点不够牢固啊我

Twilight6 发表于 2020-5-26 22:46:54

_荟桐_ 发表于 2020-5-26 22:44
删除的应该就是第一个和第二个,我刚刚好像说错了
因为代码里是remove(6),所以是从左往右找 ...

给自己整懵了 {:10_297:}

_荟桐_ 发表于 2020-5-26 22:56:57

Twilight6 发表于 2020-5-26 22:46
给自己整懵了

我脑袋报MemoryError怎么解决{:10_266:}

Twilight6 发表于 2020-5-26 22:57:55

_荟桐_ 发表于 2020-5-26 22:56
我脑袋报MemoryError怎么解决

同种错误在线求解{:10_245:}

AndyYoung 发表于 2020-5-27 03:56:00

Twilight6 发表于 2020-5-26 22:18
你输出结果错了,应该是两次:
Six



也就是for 循环每次遍历都要执行“for each in list_test”这个语句,而不是只执行其下面缩进的部分?一直以为只执行缩进的部分

Twilight6 发表于 2020-5-27 07:30:40

AndyYoung 发表于 2020-5-27 03:56
也就是for 循环每次遍历都要执行“for each in list_test”这个语句,而不是只执行其下面缩进的部分?一 ...

对啊每次都要....你这误解大了

wp231957 发表于 2020-5-27 07:44:01

在遍历列表时,不要对元素进行增减变动
或者说,在循环时,不要对循环变量进行增减变动

sunrise085 发表于 2020-5-27 10:40:50

对于可变类型对象的遍历,不建议在循环体内增删元素。因为可能会影响遍历。
就像你这个程序,在循环过程中删除元素,导致列表list_test长度变短,导致部分元素没有被遍历。
,第六次循环的时候遍历的是list_test,然后执行了remove操作,把下标5的元素删除了,原来下标为6的元素下标变成了5,在下次循环的时候,会遍历下标为6的元素,而实际上遍历的是原下标为7的元素。

若真想在循环体内修改遍历对象的话,遍历条件写成原列表的拷贝。这样,遍历的对象就是愿列表的一个拷贝,和你在循环体内修改的对象就不是同一个列表了。
list_test =
for each in list_test[:]:
      if each == 6:
                list_test.remove(6)
                print("Six")
                print(list_test)
页: [1]
查看完整版本: 关于遍历,为什么遍历不全