初學者在python遍歷序列同時刪除相鄰元素時的易錯點
阿新 • • 發佈:2019-01-01
(1)問題的案例
以列表List為例
現在有一個列表,我想要遍歷它,然後判斷每個元素是否滿足某個條件而需要被刪除,如下面一段程式碼:
test = [11,22,33,44,55,66]
for temp in test:
if temp == 22 or temp == 33:
test.remove(temp)
我們理想的執行結果是:
[11,44,55,66]
但是實際執行結果卻是:
[11,33,44,55,66]
(2)問題出現的原因
33沒有被刪除掉!這是因為 當 for 的游標 移動到22時 發現22滿足條件需要被刪除,那麼就把22刪除了,這時後面的33發現22被刪除後留下了空位置就自動補位移動到了原先22的位置,但是游標卻忽視了,游標沒有管這個位置,直接跳向下一個,也就是指向了44。
這就是33沒有沒刪除的原因。
這是一個非常危險的bug,實際開發中,如果應該被刪除但是卻被漏掉的垃圾會不斷累積直到造成記憶體溢位。
(3)可行的解決方案
我的解決方案是,在一次遍歷時,不刪除,而是將不應該刪除的元素,儲存到一箇中間變數中。
test = [11,22,33,44,55,66]
dataBackup = []
for temp in test:
if temp != 22 and temp != 33:
dataBackup.append(temp)
test = dataBackup
以上OK!