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

 

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM