首頁 > 後端開發 > Python教學 > 為什麼我的 Python 列表理解會改變變數的值?

為什麼我的 Python 列表理解會改變變數的值?

Susan Sarandon
發布: 2024-11-29 12:08:11
原創
844 人瀏覽過

Why Does My Python List Comprehension Change My Variable's Value?

意外行為:列表推導式改變變數作用域

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

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