Am einfachsten lässt sich das veranschaulichen, wenn man sich vorstellt, dass die Iteration mit Listen-Offsets anstelle der eigentlichen Elemente arbeitet - man tut etwas mit dem ersten Element, dann mit dem zweiten Element, dann mit dem dritten Element, bis keine Elemente mehr vorhanden sind. Wenn Sie die Anzahl der Elemente in der Liste ändern, ändern sich auch die Offsets aller verbleibenden Elemente in der Liste:
lst = [1,2,3,4]
for item in lst:
if item==2:
lst.remove(item)
else:
print item
print lst
führt zu
1
4
[1,3,4]
was Sinn macht, wenn man es so durchgeht:
[1,2,3,4]
^
first item is not 2, so print it -> 1
[1,2,3,4]
^
second item is 2, so remove it
[1,3,4]
^
third item is 4, so print it -> 4
Die einzige wirkliche Lösung ist die Anzahl der Elemente in der Liste nicht ändern, während Sie die Liste durchgehen . Kopieren Sie die Elemente, die Sie beibehalten möchten, in eine neue Liste, oder behalten Sie die Werte im Auge, die Sie entfernen möchten, und führen Sie das Entfernen nach Wert in einem separaten Durchgang durch.