为什么这里输出是[3,6],而不是3

img

img


为什么这里输出的是[3,6],而不是[3],想要详细一点的解答

因为for在开始的时候,执行到的索引是固定的,所以如果你remove了东西,那么原来的所有数就会往左移,但是索引固定了,就导致remove的时候,一下跨了两个数。
【6,3,6,6,6】原来是这个,索引在0,remove了第一个6
变成【3,6,6,6】但是这个时候,索引+1,变成1了。这时候就“不对劲“了。因为索引为1的是6,不是原来的3。
然后索引为1,那么就会remove现在的第一个6,变成【3,6,6】。
这个时候就更”不对劲“了。因为现在索引+1,变成2了。2的时候虽然会remove掉最后一个6,但是你会发现这个时候剩了一个6。
所以,解决方法就是倒序来remove,从尾开始,这样索引不会变

这个应该是索引为3的6被保留了下来,你可以尝试模拟一下整个过程,list是在不断变短的并且i是在不断往后走的

for i in x[:] 遍历时x在变,in x[:] 用x的全切片来遍历就好了

>>> x = [6,3,6,6,6]
>>> for i in x:
    print(i,x)
    if i==6:
        x.remove(i)

        
6 [6, 3, 6, 6, 6]
6 [3, 6, 6, 6]
6 [3, 6, 6]
>>> x
[3, 6]
>>> x = [6,3,6,6,6]
>>> for i in x[:]:
    print(i,x)
    if i==6:
        x.remove(i)

        
6 [6, 3, 6, 6, 6]
3 [3, 6, 6, 6]
6 [3, 6, 6, 6]
6 [3, 6, 6]
6 [3, 6]
>>> x
[3]

不要在遍历期间做删除操作,实在要做,可以使用while循环自己控制索引增长,或者先遍历一边,记录下要删除的索引,然后再依次删除(在删除的时候需要实时更新索引,应该做了一次删除后,你之前记录的索引一定是大于现在实际目标索引的,举个例子,之前记录了某个要删除的索引为n,当前已经删除了m个元素,那么现在n-m索引的元素才是你之前记录的n索引的元素.

因为remove 是删除并返回结果