這不是一個錯誤。請參閱Remove items from a list while iterating瞭解如何完美地完成此操作。
列表是一種可變數據類型。如果從中刪除元素,則列表的長度(以及元素的索引)將會更改。在第二個示例中,如果要在刪除前後打印內容的長度,您會看到不同之處,因爲您不假定舊索引和長度對列表有效。
考慮下面的例子就明白了更多,當這個例外發生在:
>>> content = range(4)
>>> content
[0, 1, 2, 3]
>>> len(content)
4
>>> count = 0
>>> length = len(content)
>>> while count < length:
... print count, length, content, len(content)
... content.remove(content[count])
... count += 1
...
0 4 [0, 1, 2, 3] 4
1 4 [1, 2, 3] 3
2 4 [1, 3] 2
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
IndexError: list index out of range
很顯然,你迭代的長度是恆定的,但數量的值被簡單地對應該列表中不存在的索引位置。
要解決一個列表的這個可變的性質,可以從列表的末尾刪除元素:
>>> content = range(4)
>>> count = len(content) - 1
>>> while count >= 0:
... print count, length, content, len(content)
... content.remove(content[count])
... count -= 1
...
3 4 [0, 1, 2, 3] 4
2 4 [0, 1, 2] 3
1 4 [0, 1] 2
0 4 [0] 1
>>> print content
[]
或者你可以pop
/remove
的第一個元素始終,作爲其他的答案點。
另外'計數
TigerhawkT3
@mu無說明爲什麼a.remove(x)當x是一個legigment值時,不起作用 – Shane