python中循環刪除列表中元素時的坑!

 

循環刪除列表中元素時千萬別用正序遍歷,必定要用反序遍歷!函數

 

廢話很少說,先上案例代碼:spa

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


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


面對以上代碼,乍一看覺得會打印出空列表,由於test函數內經過for的方法將data中的元素都刪除了,其實否則,實際輸出以下:code

[2]

 

 

爲何會產生這種結果呢? 咱們來深度剖析一下:blog

原列表在內存中爲:內存

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

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

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

 

 

如何解決這個問題呢? 咱們能夠用倒序刪除的方法!原理

直接上代碼:循環

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’刪除,列表變爲空列表!

 

 

總結:正序刪除列表中元素時,被刪元素後面的值會向前頂,而後致使漏刪。倒序刪除元素時,被刪元素前面的值不會向後靠,因此能夠完整的遍歷到列表中全部的元素。

相關文章
相關標籤/搜索