Python新手常見問題五:在遍歷列表的同時又修改該列表

daqianmen發表於2021-09-11

Python新手常見問題五:在遍歷列表的同時又修改該列表

在遍歷列表的同時又在修改這個列表

下面這個例子中的程式碼應該比較明顯了:

>>> odd = lambda x : bool(x % 2)
>>> numbers = [n for n in range(10)]
>>> for i in range(len(numbers)):
...     if odd(numbers[i]):
...         del numbers[i]  
# 這不對的:在遍歷列表時刪掉列表的元素。
...
Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
IndexError: list index out of range

遍歷一個列表或者陣列的同時又刪除裡面的元素,對任何有經驗的軟體開發人員來說這是個很明顯的錯誤。但是像上面的例子那樣明顯的錯誤,即使有經驗的程式設計師也可能不經意間在更加複雜的程式中不小心犯錯。

相關推薦:《》

所幸,Python整合了一些優雅的程式設計正規化,如果使用得當,可以寫出相當簡化和精簡的程式碼。一個附加的好處是更簡單的程式碼更不容易遇到這種“不小心在遍歷列表時刪掉列表元素”的bug。例如列表推導式(list comprehensions)就提供了這樣的正規化。再者,列表推導式在避免這樣的問題上特別有用,接下來這個對上面的程式碼的重新實現就相當完美:

>>> odd = lambda x : bool(x % 2)
>>> numbers = [n for n in range(10)]
>>> numbers[:] = [n for n in numbers if not odd(n)]  
# 啊,這多優美
>>> numbers
[0, 2, 4, 6, 8]

相關推薦:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1727/viewspace-2837414/,如需轉載,請註明出處,否則將追究法律責任。

相關文章