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

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

DDD
DDD原創
2024-11-30 11:51:10827瀏覽

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中文網其他相關文章!

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