在循环时修改列表的奇怪行为(Python)

时间:2016-02-06 11:13:54

标签: python-2.7

我知道在迭代时修改可能会造成灾难。我好奇,所以我尝试了。在下面的前几种情况下,事情按预期进行。但是倒数第二个发生了什么?为什么存在第五个零(最后一个)会导致较早的零被删除?

>>> A = [0, 0, 0, 0]
>>> for k in A:
        if k == 0:
            A.remove(k)
>>> A
[0, 0]


>>> A = [0, 0, 0, 0, 1]
>>> for k in A:
        if k == 0:
            A.remove(k)
>>> A
[0, 0, 1]


>>> A = [0, 0, 0, 0, 1, 1]
>>> for k in A:
        if k == 0:
            A.remove(k)
>>> A
[0, 0, 1, 1]


>>> A = [0, 0, 0, 0, 1, 1, 0]
>>> for k in A:
        if k == 0:
            A.remove(k)
>>> A
[0, 1, 1, 0]


>>> A = [0, 0, 0, 0, 1, 1, 2]
>>> for k in A:
        if k == 0:
            A.remove(k)
>>> A
[0, 0, 1, 1, 2]

编辑! somelist.remove(x)删除第一次出现的x。知道这一点,但完全忘记了它。

2 个答案:

答案 0 :(得分:0)

我不是Python专家,但就在我想象如何实现foreach循环时:

len = size(array)
for i in range(0, len):
   loop_body(array[i])

然后是第二个例子:

len = 5,array = [0,0,0,0,1]

第一次迭代:i = 0,array = [0,0,0,0,1],数组[0]中的零被删除。

第二次迭代:i = 1,数组= [0,0,0,1],数组[1]中的零被删除。

第三次迭代:i = 2,数组= [0,0,1],数组[2] == 1,没有任何反复发生。

这是你的结果。最后一个也一样。

答案 1 :(得分:0)

remove方法会删除x的第一个。所以当我执行这段代码时:

>>> A = [0, 0, 0, 0, 1, 1, 0]
>>> for k in A:
        if k == 0:
            A.remove(k)

最后存在零,导致另一个零(前面的一个在迭代时被跳过)被删除。这产生了:

>>> A
[0, 1, 1, 0]

而不是我预期的输出:

>>> A
[0, 0, 1, 1, 0]