首頁  >  文章  >  後端開發  >  為什麼在 Python 中迭代和刪除列表會導致意外結果

為什麼在 Python 中迭代和刪除列表會導致意外結果

Patricia Arquette
Patricia Arquette原創
2024-10-19 09:55:30345瀏覽

Why Iterating and Removing from a List in Python Can Cause Unexpected Results

在迭代過程中從列表中刪除項目- 為什麼典型的習慣用法會失敗

在編程中,迭代列表並刪除是常見的做法根據需要的項目。然而,當涉及 Python 時,有一個警告,這個習慣用法可能會導致意外結果。

考慮以下 Python 程式碼:

<code class="python">letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']
for i in letters:
    letters.remove(i)
print(letters)</code>

此程式碼嘗試從清單。令人驚訝的是,程式碼的輸出不是空列表,而是包含原始列表中的所有其他項目:

['b', 'd', 'f', 'h', 'j', 'l']

解釋

這樣做的原因行為在於Python 在迭代期間處理列表修改。文件明確指出:

「修改循環中迭代的序列是不安全的[...] 如果您需要修改正在迭代的清單[...] 您必須迭代在副本上。」

在提供的程式碼中,我們嘗試在迭代時修改列表字母。 Python 處理這種情況的設計是,每次刪除後迭代都會跳過所有其他項目。

重寫程式碼

要避免此問題,程式碼必須是重寫以在迭代列表之前建立清單的副本。有幾種方法可以實現此目的:

  • del letter[:]: 從清單中刪除所有項目,有效地將其替換為空白清單。
  • letters[:] = []: 與 del letters[:] 類似,但產生一個新的空列表,而不是修改原始列表。
  • letters = []: 為變數字母分配一個全新的空白列表。

或者,如果目標是根據條件刪除特定項目,則使用 filter() 函數建立新項目會更有效僅包含所需項目的清單。這種方法避免了對原始清單的副本進行迭代的需要。

以上是為什麼在 Python 中迭代和刪除列表會導致意外結果的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn