2013-02-06 72 views
0

例子:解釋這個循環中,請l.remove(I)

l = [1,2,3,4,5,6,7,8,9,0] 

for i in l: 
    print i,l 
    l.remove(i) 

返回:

1 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] 
3 [2, 3, 4, 5, 6, 7, 8, 9, 0] 
5 [2, 4, 5, 6, 7, 8, 9, 0] 
7 [2, 4, 6, 7, 8, 9, 0] 
9 [2, 4, 6, 8, 9, 0] 

那爲什麼只有5個旋轉?我預計它會翻10倍。 有人可以一步一步向我解釋嗎?

+0

http://stackoverflow.com/a/12840897/748858 – mgilson

+0

@Pol:然而,原因行爲是完全一樣的。 –

+0

@mgilson,但你肯定顯示重複。並且解釋是完美的。謝謝。 – Pol

回答

5

請注意打印的號碼如何跳過列表中的一個數字?這是因爲,我指向列表中的一個位置,並且一旦刪除了i列表,將「向左移動」一個位置,並且當i遞增時,它實際上將兩個位置移動到右側。因此,在第五次迭代之後,您將位於0的右側或不在列表中。

+0

對不起,但尚不清楚。 – Pol

+0

@Pol試圖找出自己爲什麼只打印奇數,然後再次嘗試閱讀我的答案。 –

+0

非常感謝,我在老問題中找到了很好的解釋? – Pol

1

此問題與使用的編程語言(在本例中爲Python)無關,並且在迭代時從集合中刪除項目時發生。在本例中,在每次循環迭代之後,集合中當前項目的索引自動增加1以指向下一個項目;當你刪除一個物品時,物品左移一個,丟失其中一個物品。

防止這種情況的一種方法是以相反的順序遍歷列表。

for i in reversed(l): 
    print(i,l) 
    l.remove(i) 

產生:

0 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] 
9 [1, 2, 3, 4, 5, 6, 7, 8, 9] 
8 [1, 2, 3, 4, 5, 6, 7, 8] 
7 [1, 2, 3, 4, 5, 6, 7] 
6 [1, 2, 3, 4, 5, 6] 
5 [1, 2, 3, 4, 5] 
4 [1, 2, 3, 4] 
3 [1, 2, 3] 
2 [1, 2] 
1 [1] 
+0

這個很好。謝謝。 – Pol

+1

或者你可以像這樣迭代列表副本:'for i in l [:]:l.remove(i)' – Pol