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