首頁 >後端開發 >Python教學 >Python 3 中的 exec() 是否會更新局部變數?

Python 3 中的 exec() 是否會更新局部變數?

Linda Hamilton
Linda Hamilton原創
2024-12-12 21:55:10410瀏覽

Does `exec()` Update Local Variables in Python 3, and If Not, How Can It Be Made To?

exec 對局部變數的影響:深入了解

exec 函數是動態程式碼執行的Python 主打函數,它提出了一個有趣的查詢:它可以更新函數內的局部變數嗎?

Python 3困境

在Python 3 中,以下程式碼片段無法像人們預期的那樣更新局部變數:

def f():
    a = 1
    exec("a = 3")
    print(a)

它令人們震驚地打印出',而不是預期的'3'。 1'!

Python 2行為

奇怪的是,Python 2 中的相同程式碼確實會更新局部變量,列印「3」。這種差異源自於 Python 處理局部變數方式的根本性變化。

局部困境

與 Python 2 不同,Python 3 將局部變數儲存在最佳化的凍結陣列中編譯時。這種效率是以禁止運行時修改局部變數為代價的。因此,Python 3 中預設的 exec 呼叫無法成功更改局部變數。

The Magic of Locals()

要繞過此限制並更新局部變量,必須明確傳遞本地字典給 exec。該字典將在執行動態程式碼後儲存更新的局部變數。修改後的程式碼如下所示:

def foo():
    ldict = {}
    exec("a = 3", globals(), ldict)
    a = ldict['a']
    print(a)

Exec() 的意思

Python 3 文件明確警告不要在使用exec 時修改預設的locals()字典,因為這可能會導致不可預測的行為。為了安全起見,當打算更新局部變數時,應該總是傳遞一個明確的局部字典給 exec。

Python 的奇妙優化

Georg Brandl 對 Python 的深刻評論bug 報告強調,Python 3 對局部變數的最佳化導致了當前的行為。編譯器無法區分自訂 exec 函數和 Python 自己的函數,因此無法為它們提供特殊待遇。因此,預設的 exec 不能改變局部變數。

Python 2 的異常

在 Python 2 中,舊的 exec 語句的工作方式不同。它允許借助編譯器對內建 exec 的特殊處理來動態修改局部變數。

結論

Python 3 中的 exec 呼叫需要一個微妙的修改局部變數的方法發生變化。透過使用顯式本機字典,開發人員可以利用動態程式碼執行的強大功能,同時保持對本地變數的控制。

以上是Python 3 中的 exec() 是否會更新局部變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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