关于遍历,为什么遍历不全
请教大家个问题:为什么用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:53 编辑
你输出结果错了,应该是两次:
Six
Six
原列表是指 :
因为你第一次遍历是按照 这个列表遍历的,然后遍历到第一个6时候,此时for指向的是原列表的第一个6
通过 remove移除一个 6得到列表 ,此时因为第一个6被移除了,第二个6就会往前进一位,所以for指向了原列表的第二个 6
再一次 for 遍历就是列表 而继续从下一个6 开始,也就是第三个6,所以通过remove 再次移除一个 6 导致列表变成,这时候for循环已经到结尾了,因为列表长度被你remove变短了
楼上正解 Twilight6 发表于 2020-5-26 22:39
对的 第一次遇到的6 和最后一次遇到的6
删除的应该就是第一个和第二个,我刚刚好像说错了{:10_250:}
因为代码里是remove(6),所以是从左往右找,然后就找到第一个和第二个六
到第三个的时候正好遍历完了 本帖最后由 Twilight6 于 2020-5-26 22:54 编辑
_荟桐_ 发表于 2020-5-26 22:44
删除的应该就是第一个和第二个,我刚刚好像说错了
因为代码里是remove(6),所以是从左往右找 ...
对哦我也懵了 remove是按顺序的!
我之前是对的...被你误导下,我以为我错了,{:10_285:} 白白编辑了那么久,重新编辑了个错的,现在改回来了
看来知识点不够牢固啊我 _荟桐_ 发表于 2020-5-26 22:44
删除的应该就是第一个和第二个,我刚刚好像说错了
因为代码里是remove(6),所以是从左往右找 ...
给自己整懵了 {:10_297:} Twilight6 发表于 2020-5-26 22:46
给自己整懵了
我脑袋报MemoryError怎么解决{:10_266:} _荟桐_ 发表于 2020-5-26 22:56
我脑袋报MemoryError怎么解决
同种错误在线求解{:10_245:} Twilight6 发表于 2020-5-26 22:18
你输出结果错了,应该是两次:
Six
也就是for 循环每次遍历都要执行“for each in list_test”这个语句,而不是只执行其下面缩进的部分?一直以为只执行缩进的部分 AndyYoung 发表于 2020-5-27 03:56
也就是for 循环每次遍历都要执行“for each in list_test”这个语句,而不是只执行其下面缩进的部分?一 ...
对啊每次都要....你这误解大了 在遍历列表时,不要对元素进行增减变动
或者说,在循环时,不要对循环变量进行增减变动 对于可变类型对象的遍历,不建议在循环体内增删元素。因为可能会影响遍历。
就像你这个程序,在循环过程中删除元素,导致列表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]