2017-03-14 22 views
1

在這條巨蟒片段:當循環體中使用remove時,python「for ... in ...」是如何工作的?

l = [10,20,30,40,50] 
for i in l: 
    l.remove(i) 
    print(i) 
print(l) 

輸出是:

10 
30 
50 
[20, 40] 

這種行爲在Python需要好幾個小時的調試。 「for ... in ...」如何運作?

+0

我想,它使用一個內部索引器,所以當你開始時,你在索引0,然後跳到1等等,但是因爲你也從數組中刪除的東西,l [1]原本是20,但現在是30,所以最終結果是你得到了什麼。只是一個猜測,因爲我不是一個專業的蟒蛇 –

+0

這可能有助於:http://stackoverflow.com/questions/1207406/remove-items-from-a-list-while-iterating – Craig

+0

而另一個:http:// stackoverflow.com/questions/6260089/strange-result-when-removing-item-from-a-list – Craig

回答

2

代碼中的'i'取得l列表中每個元素的值。所以打字for i in l我將首先成爲第一個索引,在這種情況下,10,然後執行下面的代碼,這將我從列表中刪除,所以現在你的列表是[20,30,40,50]它打印我..這是10.它然後跳到下一個索引,l [1]即NOW 30並執行代碼。

+0

請注意,儘管CPython的行爲如此,但該行爲未明確且不應依賴。 – spectras

+0

未來,請將重複的問題標記爲封閉,而不是回答問題,因爲後者會增加分散性並使網站難以瀏覽。 – TigerhawkT3

2

作爲@A。 Lau提到,在for循環的第二次迭代中,i將被索引爲l的第二個元素,因此l[1]=30將被分配給i

如果你真的想在for循環中刪除元素,你可以嘗試這樣的事:

l = [10,20,30,40,50] 
for i in l[:]: 
    l.remove(i) 
    print(i) 
print(l) 

結果將是:

10 
20 
30 
40 
50 
[] 
+0

未來,請將重複問題標記爲封閉而不是回答問題,因爲後者會增加分散性並使網站難以瀏覽。 – TigerhawkT3

+1

@ TigerhawkT3得到了它,感謝您的信息:-) – Icyblade