循環刪除列表中元素時千萬別用正序遍歷,必定要用反序遍歷!函數
廢話很少說,先上案例代碼: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’刪除,列表變爲空列表!
總結:正序刪除列表中元素時,被刪元素後面的值會向前頂,而後致使漏刪。倒序刪除元素時,被刪元素前面的值不會向後靠,因此能夠完整的遍歷到列表中全部的元素。