可以對迴圈中迭代串列新增或刪除項目嗎? 答案是盡量不要這麼做,因為可能會造成非預期之錯誤。
請思考如下情況,也請參考 https://autbor.com/addingloop 網站,查看這段程式碼視覺化。
clothes = ['skirt', 'red sock']
for clothing in clothes: # Iterate over the list.
if 'sock' in clothing: # Find strings with 'sock'.
clothes.append(clothing) # Add the sock's pair.
print('Added a sock:', clothing) # Inform the user
此段程式在做迭代串列中每個字串項目,該字串若有出現"sock"時候就append該項目到串列中。但是此段程式會造成無窮迴圈,原因在於當您把"red sock" append進來時for迴圈進入下一次迭代判定該項目有"sock"字串,就會再append一次"red sock",同理下一輪又是如此因此造成無窮迴圈錯誤。
修正方法為獨立一個串列來進行新增修改的處理,也請參考https://autbor.com/addingloopfixed ,如範例使用newClothes串列來處理。
上面的範例為新增項目,同理在迭代串列時不能從串列中刪除項目。請參考https://autbor.com/deletingloop/ 網站。
最終結果"yello"應該被刪除的,但是最後還是留在串列中。由於當for迴圈檢查所引2時從串列中刪除"mello",而原本"yello"從索引3變成2了此項目就被跳過。因此對迴圈中迭代串列不要對串列中項目做刪除。正確方法同樣為建立一個新串列來處理,請參考https://autbor.com/deletingloopfixed/
參考資料:
python功力提升的樂趣 第8章