簡體   English   中英

在函數內調用 exec - NameError

[英]Call exec inside a function - NameError

為什么這段代碼會引發NameError ?:

def func():
    exec("my_var = 42")
    print(my_var)
func()

有很多相關的問題,但我還沒有找到關於 WHY 的明確答案。 我不想要解決方法。

另外,我注意到代碼在我運行時有效:

exec("my_var = 42", globals(), globals())

但不確定為什么。

exec()文檔指出:“...如果省略了可選部分 [第二個和第三個參數],則代碼將在當前范圍內執行。”。 當前作用域是func()函數。 為什么我不能從同一范圍訪問my_var

解析器/編譯器不考慮exec()的參數(因為它可能是一個變量)。 因此,當它解析函數時,它看不到對my_var的賦值,因此將其視為全局變量。 但是exec()中的賦值會創建一個局部變量。 因此,分配的變量與它嘗試打印的變量不同。

此外,如果您希望對局部變量的更改可見,則必須顯式傳遞locals()字典。 [文檔] 指出:

注意:默認locals的行為如下面函數locals()所述:不應嘗試修改默認locals字典。 如果您需要在函數exec()返回后查看代碼對局部變量的影響,請傳遞顯式局部變量字典。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM