首頁 > 後端開發 > Python教學 > 為什麼 Python 2 的列表推導式會重新綁定變量,Python 3 是如何改變這一點的?

為什麼 Python 2 的列表推導式會重新綁定變量,Python 3 是如何改變這一點的?

DDD
發布: 2024-11-30 11:51:10
原創
804 人瀏覽過

Why Does Python 2's List Comprehension Rebind Variables, and How Did Python 3 Change This?

列表推導式和名稱重新綁定

列表推導式是在 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板