[英]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.