常見錯誤一:使用固定長度循環刪除列表元素
l = ['a','b','c'] for i in range(len(l)): l.pop(i)
報錯:
ValueError: list.remove(x): x not in list
原因:
在刪除list中的元素后,list的實際長度變小了,但是循環次數沒有減少,依然按照原來list的長度進行遍歷,所以會造成索引溢出。是的,i的值是一開始就生成好了(0,1,2),后面不會因為列表大小變化了再變化。
圖示:
執行第一次pop前,i是0

執行第一次pop后,刪除了索引0原來的a

執行第二次pop前,i是1

執行第二次pop后,刪除了索引1原來的c

執行第三次pop前,i是2。繼續執行pop,索引2已超出了列表范圍(此時列表只有索引0了)。

解決方法:倒序循環遍歷
l = ['a','b','c'] for i in range(len(l)-1, -1, -1): l.pop(i)
常見錯誤二:正序循環遍歷刪除列表元素
l = ['a','b','c'] for i in l: l.remove(i) print l
結果:
['b']
原因:
按順序循環刪除,怎么會有一個沒刪除呢?原因同上,i的值是一開始就生成好了(0,1,2),后面不會因為列表大小變化了再變化。但是列表因為值的刪除,是在變化的。
圖示:
執行第一次remove前,i是索引0的a

執行第一次remove后,i是索引0的a被刪除

執行第二次remove前,i是索引1的c

執行第二次remove后,i是索引1的c被刪除。之后繼續執行i是索引2,此時列表已經沒有索引2了,循環退出。最后b就被剩下了。

解決方法一:倒序循環遍歷:
l = ['a','b','c'] for i in l[::-1]: l.remove(i) print l
解決方法二:深拷貝一個ll,對l遍歷,對ll操作
l = ['a','b','c'] ll = l[:] for i in l: ll.remove(i)
此方法的缺點是對於過大的list,拷貝后可能很占內存。那么對於這種情況,可以用倒序遍歷的方法來實現。
---------------------------------------------------------------------------------
關注微信公眾號(測試工程師小站)即可在手機上查閱,並可接收更多測試分享,發送【測試資料】更可獲取百G測試教程~

