列表推導式的意外行為:反彈名稱和模糊範圍
Python 的列表推導式提供了一種簡潔且便捷的方式來創建列表,但它們有一個隱藏的陷阱:重新綁定名稱甚至超出了理解本身的範圍。在 Python 2 中,這種奇特的行為是令人沮喪和程式錯誤的根源。
考慮以下程式碼:
x = "original value" squares = [x**2 for x in range(5)] print(x) # Prints 4 in Python 2!
在Python 2 中,執行此程式碼將意外地列印4 而不是「原值。」這是因為清單推導式將循環控制變數x洩漏到周圍的作用域中,覆蓋其原始值。
此行為源自於列表推導式在 Python 2 中的實作方式:作為提高效率的最佳化。然而,這一直是 Python 程式設計師的一個重大痛點,導致錯誤和混亂。
值得慶幸的是,在 Python 3 中,這個「骯髒的小秘密」被消除了。列表推導式現在採用與生成器表達式相同的實作策略,即使用單獨的執行框架。因此,在 Python 3 中,上面的程式碼片段按照預期正確列印了“原始值”,因為推導式中的 x 不會掩蓋周圍範圍中的 x。
Guido van Rossum,Python 的創建者,解釋了此更改背後的原因:
“[我們進行此更改]通過使用與以下相同的實現策略來修復列表理解的“骯髒的小秘密」生成器表達式。」
Python 3 中的這種改進行為證明了Python語言的持續開發和完善,確保了清單理解使用的清晰度和可預測性。
以上是為什麼 Python 2 的列表解析會在其範圍之外重新綁定名稱?的詳細內容。更多資訊請關注PHP中文網其他相關文章!