You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法在Python的exec字符串内声明并修改全局变量?

问题根因

Python解释器编译函数时会提前扫描所有显式变量赋值操作,判定变量作用域。你函数末尾有ostr='asd'这行赋值,因此编译阶段就把ostr标记为局部变量。而exec里的global声明是运行时才执行的,编译阶段无法识别,执行print(ostr)时解释器会去找尚未赋值的局部ostr,直接抛出UnboundLocalError。
直接写在函数内的global ostr是编译阶段可识别的,因此取消注释后运行正常。

解决方案

如果你必须严格要求global声明只能写在exec字符串内,不能在函数其他位置出现,使用如下方案:

方案1:主动读取全局作用域变量

所有需要读取全局ostr的位置,主动从globals()字典取值即可,exec内对全局变量的修改对后续代码完全可见:

ostr = "didn't work"
nstr = "worked"
def function():
    exec("global ostr; ostr = nstr")
    # 从全局作用域读取变量
    print(globals()['ostr'])
    lv = 'ostr' in globals()
    print(lv)
    ostr = 'asd' # 此处仍为局部变量赋值,不影响全局变量
function()
# 验证全局变量已被exec修改为worked
print(ostr)

方案2:函数开头统一声明全局变量

如果你可以接受在函数开头加全局声明,这种写法更简洁,函数内所有对ostr的操作都会指向全局变量:

ostr = "didn't work"
nstr = "worked"
def function():
    global ostr # 编译阶段就标记ostr为全局变量
    exec("ostr = nstr")
    print(ostr)
    lv = 'ostr' in globals()
    print(lv)
    ostr = 'asd' # 此处修改的也是全局变量
function()
# 验证全局变量最终为asd
print(ostr)

内容的提问来源于stack exchange,提问作者Ben Barrowes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:54:03