exec 函數在 Python 2 和 Python 3 之間表現出不同的行為。在 Python 2 中,exec 是一個語句,而在Python 3中,它已經轉變為函數。這種區別對其與局部變數的交互作用具有重要意義。
在 Python 2 中,exec 語句允許修改函數作用域內的局部變數。執行 exec 語句時,Python 編譯器會暫時停用局部作用域最佳化,並切換到較慢的尋找策略來存取局部變數和全域變數。此外,如果未提供明確全域變數和局部變數參數,則 exec 語句中宣告的任何變數都會自動複製回函數的局部變數。
在 Python 3 中, exec()函數嚴格遵循函數作用域的規則。它不能再修改函數局部範圍內的變量,即使它們之前已經聲明過。 Locals() 能夠在一個方向上反映局部變量,但從未支援透過 locals() 進行修改。
為了實現在 Python 2 中觀察到的所需行為,它在 Python 3 中呼叫 exec() 時,有必要使用單獨的命名空間。透過將自訂字典傳遞給 exec() 函數,可以修改和存取該命名空間內的變數。
下面的程式碼示範了在 Python 3 中使用 exec() 的正確方法:
def execute(a, st): namespace = {} exec("b = {}\nprint('b:', b)".format(st), namespace) print(namespace['b'])
此方法可確保函數的本地作用域保持不變,同時仍允許修改定義的命名空間內的變數。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3