为什么我不能在 "exec" 字符串中声明一个全局变量

why can't I declare a global variable inside an "exec" string

我正在尝试在 exec 字符串中声明和更改全局变量,如下所示:

ostr = "didn't work"
nstr = "worked"
def function():
    exec("global ostr; ostr = nstr")
    #global ostr; ostr = nstr
    print(ostr)
    lv='ostr' in globals()
    print(lv)
    ostr='asd'

function()

但是,打印语句中出现以下错误:

UnboundLocalError: local variable 'ostr' referenced before assignment

但是,如果我在 exec 语句后注释掉“exec”行并取消注释行,代码就可以正常工作。

如何使用“exec”修复此错误?我想声明全局变量并在 exec 字符串中修改这些全局变量,并在后续行的“函数”中显示这些修改。

您必须声明您在函数中使用全局 ostr 才能打印它。这段代码输出

def function():
   global ostr
   exec("global ostr; ostr = nstr")
   #global ostr; ostr = nstr
   print(ostr)
   lv='ostr' in globals()
   print(lv)
   ostr='asd'

worked

True

编辑:刚刚意识到 exec 实际上与全局变量一起工作,如果您重新运行您的代码并在全局 main 中打印(osr),您会看到它已更改。

ostr = "didn't work"
nstr = "worked"
def function():
    #global ostr
    exec("global ostr; ostr = nstr")

function()
print(ostr)

worked

编辑#2:要么在修改前将 ostr 声明为全局变量,要么将其分配给另一个局部变量。

ostr = "didn't work"
nstr = "worked"
def function():
    exec("global ostr; ostr = nstr")
    #global ostr; ostr = nstr
    print(ostr)
    lv='ostr' in globals()
    print(lv)
        
function()

worked

True