意外行為:列表推導式改變變數作用域
Python 列表推導式是強大的資料操作工具,但它們有一個隱藏的怪癖:可能會導致意外行為。
問題
在Python 2(及更早版本)中,清單推導式可以將循環控制變數「重新綁定」到循環的最後一個值,即使在推導式的範圍結束之後也是如此。這可能會導致令人驚訝的行為:
x = "original value" squares = [x**2 for x in range(5)] print(x) # Prints 4 in Python 2!
在此範例中,循環控制變數 x 被重新分配給列表理解中循環的最後一個值 (4)。這意味著當在推導式之外呼叫 print(x) 時,它會列印 4 而不是「原始值」。
解釋
上述行為是結果清單推導式最初在 Python 2 中實現的方式。為了使清單推導式盡可能高效,循環控制變數被洩漏到周圍
Python 3 修正
在 Python 3 中,此行為已更改。列表推導式不再在推導式之外重新綁定循環控制變數。這樣做是為了提高列表推導式和生成器表達式之間的一致性,它們永遠不會重新綁定循環控制變數。
Guido van Rossum 的解釋
Guido van Rossum,創建者Python 的作者解釋了 Python 3中這項變更背後的原因:
「我們決定修復「髒」透過使用與產生器表達式相同的實作策略,可以實現清單推導式的「小秘密」。因此,在 Python 3中,上面的範例...將列印“before”,證明列表推導式中的“x”暫時隱藏但不會覆蓋周圍範圍內的“x”。 >
而list 的行為推導式一開始可能看起來違反直覺,但了解它們在Python 2 和Python 3 中的工作原理非常重要。這些知識將幫助您避免潛在的錯誤並編寫更健壯的程式碼。
以上是為什麼我的 Python 列表理解會改變變數的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!