簡體   English   中英

為什么帶有 pop 方法(或 del 語句)的 for 循環不遍歷所有列表元素

[英]Why does a for-loop with pop-method (or del statement) not iterate over all list elements

我是 Python 新手,正在嘗試使用 Python 3.2.3(默認,2012 年 10 月 19 日,20:13:42),[GCC 4.6.3] 在 linux2 上的列表

這是我的示例代碼

>>> l=[1,2,3,4,5,6]
>>> for i in l:
...     l.pop(0)
...     print(l)
... 

我希望有以下輸出

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

相反,我得到了這個

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

for 循環在 3 圈后停止迭代。 有人可以解釋為什么嗎?

展開一點(插入符號( ^ )位於循環“索引”處):

your_list = [1,2,3,4,5,6]
             ^

彈出第一個項目后:

your_list = [2,3,4,5,6]
             ^

現在繼續循環:

your_list = [2,3,4,5,6]
               ^

現在彈出第一項:

your_list = [3,4,5,6]
               ^

現在繼續循環:

your_list = [3,4,5,6]
                 ^

現在彈出第一項:

your_list = [4,5,6]
                 ^

現在繼續循環——等等,我們完成了。 :-)


>>> l = [1,2,3,4,5,6]
>>> for x in l:
...     l.pop(0)
... 
1
2
3
>>> print l
[4, 5, 6]

對於此任務,您可以使用while循環而不是for循環。

while len(some_list)>0 :
    some_list.pop(0)

for循環實際上會遍歷列表中的每個項目,這將不起作用,因為列表中的索引會隨着每次刪除而改變,並且您最終不會獲得所有項目。

但是, while循環會在每次循環運行時檢查一個條件,如果仍然為真,則再次運行代碼。 這里我們指定列表的長度必須大於0,即列表中必須有內容。

嘗試修改正在迭代的集合時必須小心。 在這種情況下,列表使用簡單的整數索引跟蹤“當前位置”。 當您使用pop() ,所有內容都會更改索引,因此會跳過元素。

在循環的第一次迭代中,i 是 l[0]。 然后彈出列表,然后訪問 l[1],這就是最初在 l[2] 處的內容。 然后你彈出列表,下一次迭代訪問 l[2],這就是以前在 l[4] 等處的內容。

無論如何都不需要在這段代碼中彈出元素,大概你在你的真實代碼中做了一些更復雜的事情。

Python 不支持在迭代列表時更改列表的長度。 處理副本或改用列表理解

想一想 Python 實際上是如何執行 for 循環的——它對元素進行計數,返回當前索引處的項目。 當您刪除一個時,索引表示不同的元素。

代碼

l = [1,2,3,4,5,6]
for i in range(len(l)):
    l.pop(0)
    print(l)

返回

[2, 3, 4, 5, 6]
[3, 4, 5, 6]
[4, 5, 6]
[5, 6]
[6]
[]
li = [1, 2, 3, 4, 5]

while li:
    # For descending order
    # print(li.pop())

    # For ascending order
    print(li.pop(0))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM