为何无法在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
相关产品推荐
相关产品推荐

