2017-10-20 110 views
1

這是一個簡單的問題。我的任務是循環列表並打印每個元素。每次打印後,我打算從列表中刪除此元素。我的代碼是:Python:在循環列表中刪除列表中的元素

>> a = [1,2] 
>> for x in a: 
>> print x 
>> a.remove(x) 
>> print a 

輸出是:

>> 1 
>> [2] 

然而,奇怪的事情發生在這裏: 只有1已經打印,它從列表中刪除1日後看來,程序跳出了直接循環。我的假設是在更改列表的內容之後,迭代器可能也會受到影響,但我不太確定。更安全的方法是:

>> a = [1,2] 
>> b = list(a) 
>> for x in b: 
>> print x 
>> a.remove(x) 
>> print a 

有人可以請給我任何更高級的解釋嗎?

+1

迭代器跟蹤位置,是的。但是,爲什麼你會去除每個元素?你最終會得到一個空的列表。 – jonatan

+3

'b = list(a)'創建列表的副本,所以'a'和'b'成爲不同的對象。 [This](https://jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-neither/)可能會有用。 – roganjosh

+0

[此答案](https://stackoverflow.com/a/34238688/8747)有一個體面的解釋。 –

回答

0

您不應該從列表中刪除要用for迭代的元素。

你的猜測是接近 - 你可以看得更清楚,如果你用一個較長的名單發生了什麼:

a = [1,2,3,4,5] 
for x in a: 
    print x 
    a.remove(x) 
    print a 

輸出:

1 
[2, 3, 4, 5] 
3 
[2, 4, 5] 
5 
[2, 4] 

它打印索引0處的元素,那麼指數1,那麼索引2 ...然後沒有索引3.

在你的例子中,它打印索引1的元素,然後沒有索引2.

2
a = [1,2] 
while a: 
    print a.pop(0) 
    print a 
相關問題