當我試圖刪除元素的所有元素通過循環是這樣的:廣東話刪除通過pop方法
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 12, 122]
for z in numbers:
a = numbers.pop(0)
print(numbers)
這就是我得到:
[8, 9, 10, 18, 12, 122]
爲什麼它不刪除所有元素?爲什麼? 謝謝!
當我試圖刪除元素的所有元素通過循環是這樣的:廣東話刪除通過pop方法
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 12, 122]
for z in numbers:
a = numbers.pop(0)
print(numbers)
這就是我得到:
[8, 9, 10, 18, 12, 122]
爲什麼它不刪除所有元素?爲什麼? 謝謝!
您的代碼將刪除一半。因爲當你使用for
循環時,它將迭代元素。現在移除列表另一側的元素,這樣兩個指針將在中途到達彼此,因此循環將停止。
所以,你開始的列表:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 12, 122]
#^
*(插入符號表示在for循環指針所在的位置),接下來你彈出和推進尖號:
[2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 12, 122]
# ^
等:
[4, 5, 6, 7, 8, 9, 10, 18, 12, 122]
# ^
[5, 6, 7, 8, 9, 10, 18, 12, 122]
# ^
[6, 7, 8, 9, 10, 18, 12, 122]
# ^
[7, 8, 9, 10, 18, 12, 122]
# ^
[8, 9, 10, 18, 12, 122]
# ^
現在索引指針到達一個點超出該範圍時,因此循環終止。但是它並沒有重複所有的元素:因爲每次你彈出一個元素,它就立即跳了兩步就這麼說。
約遍歷列出了一些一般性的建議:
您做的更好不修改列表,而你遍歷它。
一個更好的辦法來做到這一點是:
for _ in range(len(numbers)):
a = numbers.pop(0)
print(numbers)
,或者爲@Matthias提出:
while numbers:
a = numbers.pop(0)
print(numbers)
由於列表的bool(..)
是真的包含至少一個元件。所以這裏每次我們檢查numbers
中是否至少還有一個元素。
其實OP從開始刪除('.pop(0)'),而不是結束... –
@brunodesthuilliers:我剛剛注意到。編輯... –
'list.pop(0)'是O(n),我不認爲這是很好的建議,以這種方式使用它。此問題的核心顯然是一個騙局 –
爲你迭代 –
'在數z不要修改列表[:]:'應該工作。 –
@KlausD:可能更好的方法是將範圍放在'len(..)'上,因爲這需要更少的內存。 –