Python 列表推導式中的名稱重新綁定
列表推導式提供了一種在 Python 中生成列表的優雅方法。然而,它們表現出特殊的作用域語義,可能會導致意外的行為。
考慮以下程式碼片段:
x = "original value" squares = [x**2 for x in range(5)] print(x) # Prints 4 in Python 2!
令人驚訝的是,在Python 2 中,此程式碼會列印「4」而不是「原值。」發生這種情況是因為清單推導將循環控制變數(此處為「x」)「洩漏」到周圍範圍。這意味著任何後續對「x」的引用都會引用推導式中指派的值,即使推導式之外存在同名變數也是如此。
此行為繼承自列表推導式的原始實現,它優先考慮效能而不是封裝。在Python 3中,這個「骯髒的小秘密」被消除了。清單推導式現在使用與生成器表達式相同的實作策略,可以防止名稱隱藏。因此,在 Python 3 中,上述程式碼將列印「原始值」。
Python 的創建者Guido van Rossum 解釋了這項變更背後的原理:
「在Python 中2、清單推導式將循環控制變數洩漏到周圍範圍中,這是無意的,並導致了混亂和錯誤,在Python 3 中,此行為已更改為匹配生成器表達式,從而阻止了名稱。
雖然此變更增強了Python 程式碼的穩健性,但了解Python 2 和3 之間的不同行為至關重要。可以幫助減輕這種潛在的陷阱。
以上是Python 2 和 3 列表推導式中的名稱重新綁定有何不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!