python中循环删除列表中元素时的坑
1.案例
alist = [2,4,5,6,7] for var in alist: if var %2 == 0: alist.remove(var) print(alist)
-
对于上述代码,第一眼我们会得出结果 [5,7]
-
但当我们执行后得到结果为 [4, 5, 7]
-
那么原因是什么呢?
2.案例分析
1.原列表在内存中存储可抽象成: # [2,4,5,6,7] 2.当第一次执行 alist.remove(var)时将第一个元素‘2’删除,列表变为: # [4,5,6,7] 3.当第二次执行 alist.remove(var)时 var 为第二个元素,即'5' ,此时不进行删除,列表保持不变: # [4,5,6,7] 4.当第三次执行 alist.remove(var)时 var 为第三个元素,即'6' ,删除'6',列表变为: # [4,6,7] 5.当第四次执行 alist.remove(var)时 var 时此时列表已经没有第四个元素了,即退出循环,将[4,5,7]返回。 # [4,6,7]
3.问题的解决
可以用倒序删除的方法
blist = alist[::-1] for var in blist: if var %2 == 0: blist.remove(var) print(blist)
总结:正序删除列表中元素时,被删元素后面的值会向前顶,然后导致漏删。倒序删除元素时,被删元素前面的值不会向后靠,所以可以完整的遍历到列表中所有的元素。