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)

总结:正序删除列表中元素时,被删元素后面的值会向前顶,然后导致漏删。倒序删除元素时,被删元素前面的值不会向后靠,所以可以完整的遍历到列表中所有的元素。

posted @ 2019-10-16 15:39  Primrose  阅读(478)  评论(0编辑  收藏  举报