1. 程式人生 > 實用技巧 >python中迴圈刪除列表中元素時的坑

python中迴圈刪除列表中元素時的坑

迴圈刪除列表中元素時千萬別用正序遍歷,一定要用反序遍歷!

案例程式碼:

def test(data):
    for i in data:
        data.remove(i)
    return data


data = [1, 2, 3]
print(test(data))

乍一看以為會打印出空列表,因為test函式內通過for的方法將data中的元素都刪除了,其實不然,實際輸出如下:

[2]

為什麼會產生這種結果呢? 我們來深度剖析一下:

原列表在記憶體中為:

第一次執行到data.remove(i)時將第一個元素‘1’刪除,列表變為:

第二次執行到data.remove(i)時i為第二個元素,即‘3’,此時將‘3’刪除,列表變為:

此時列表已經沒有第三個元素了,即退出迴圈,將[2]返回。

如何解決這個問題呢? 我們可以用倒序刪除的方法!

直接上程式碼:

def test(data):
    for i in data[::-1]:
        data.remove(i)
    return data


data = [1, 2, 3]
print(test(data))

此時再執行,發現輸出結果為空列表

[]

倒序刪除原理如下:

原列表在記憶體中為:

第一次執行到data.remove(i)時是將倒數第一個元素‘3’刪除,列表變為:

第二次執行到data.remove(i)時i為倒數第二個元素,即‘2’,此時將‘2’刪除,列表變為:

第三次執行到data.remove(i)時i為倒數第三個元素,即‘1’,此時將‘1’刪除,列表變為空列表!

總結:正序刪除列表中元素時,被刪元素後面的值會向前頂,然後導致漏刪。倒序刪除元素時,被刪元素前面的值不會向後靠,所以可以完整的遍歷到列表中所有的元素。