列表推導式和名稱重新綁定
列表推導式是在 Python 中建立列表的簡潔語法。然而,它們在與範圍界定互動時表現出意想不到的行為。
考慮以下程式碼:
x = "original value" squares = [x**2 for x in range(5)] print(x) # Prints 4 in Python 2!
在此範例中,列表理解將變數 x 重新綁定到迭代中的目前值範圍(5)。這種行為稱為名稱重新綁定。
名稱重新綁定的原因
在 Python 2 中,列表推導式的實作方式與產生器表達式不同。透過將循環控制變數洩漏到周圍範圍來優化清單推導式的速度。另一方面,生成器表達式使用單獨的執行框架,防止這種洩漏。
Python 3 的變更
在 Python 3 中,這種差異已被刪除。列表推導式現在使用與生成器表達式相同的實作。因此,Python 3 中不再發生名稱重新綁定。
後果
名稱重新綁定可能會導致意外的行為和錯誤,特別是在變量名稱相同的情況下用於列表理解和周圍範圍。如同問題中所提到的,可以透過在清單推導式中使用底線前綴作為臨時變數來緩解此問題。
Python 的創建者 Guido van Rossum 解釋了此更改背後的歷史:在 Python 2 中,列表推導式洩漏循環控制變數作為初始實現的工件以優化性能。然而,在 Python 3 中,這被認為是一個骯髒的小秘密,應該透過採用與生成器表達式相同的實作策略來修復。
以上是為什麼 Python 2 的列表推導式會重新綁定變量,Python 3 是如何改變這一點的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!