如何無法直接使用exec 更新局部變數
Python 中的exec 呼叫是動態執行程式碼的強大工具,但是它對局部變數的修改有限制。
考慮以下內容code:
def f(): a = 1 exec("a = 3") print(a) f()
人們可能會期望這段程式碼列印 3,但它實際上會列印 1。這是因為在 Python 3 中,局部變數不是儲存在字典中,而是儲存在編譯時確定索引的陣列中時間。 exec 函數無法在不干擾此最佳化的情況下安全地修改局部變數。
解決方案:使用 Local Dictionary 與 exec
要使用 exec 修改局部變量,您需要明確傳遞本地字典。例如:
def foo(): ldict = {} exec("a = 3", globals(), ldict) a = ldict['a'] print(a)
這會執行本地字典 (ldict) 中的程式碼,這與函數的本地變數陣列不同。然後可以透過存取本地字典將修改後的變數傳回函數的作用域。
Python 2 行為
在Python 2 中,exec 可以修改局部變數而無需傳遞明確字典,因為它將使用不含全域/本地參數的exec的命名空間視為「未最佳化」。然而,Python 3 中並非如此。
因此,請務必記住,在使用 exec 時,只能透過建立和傳遞本機字典來更新局部變量,以避免與編譯器的最佳化發生任何潛在衝突.
以上是為什麼 Python 3 中的 exec 不能直接更新局部變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!