Python中使用exec定义全局变量不生效该如何解决
exec动态定义全局变量报错的解决方法
报错根源
你拆分了global声明和变量赋值为两个独立的exec执行块,global关键字的作用范围仅限它所在的单个编译代码块,第二个exec执行赋值操作时无法识别前一个块的global声明,只会在exec的临时局部作用域中赋值,不会写入模块全局命名空间,因此后续调用时找不到对应变量。
解决方法
有两种可行的实现方式,都可以正常写入全局变量并跨方法调用:
方式1:合并声明与赋值到同一执行块,显式指定全局命名空间
将global声明和变量赋值放在同一段待编译的代码中,同时给exec、eval传入globals()参数,强制操作模块全局命名空间,避免作用域混淆:
def set_globvar_to_one(): # 同一块内global声明对整段代码生效,显式指定使用全局命名空间 exec(compile("global globvarq\nglobvarq = 2", "setglobal", "exec"), globals()) def print_globvar(): # eval显式从全局命名空间查找变量 eval(compile("print(globvarq)", "setglobal", "eval"), globals()) set_globvar_to_one() print_globvar()
方式2:拆分执行但统一指定全局命名空间
如果业务需要拆分global声明和赋值为两个独立的执行步骤,只要给每个exec都传入globals()参数,也可以正常写入全局变量:
def set_globvar_to_one(): exec(compile("global globvarq","setglobal","exec"), globals()) exec(compile("globvarq = 2","setglobal","exec"), globals()) def print_globvar(): eval(compile("print(globvarq)","setglobal","eval"), globals()) set_globvar_to_one() print_globvar()
简化写法
如果不需要严格保留global声明的写法,直接给exec传入全局命名空间参数后,甚至可以省略global关键字,变量会直接写入全局:
def set_globvar_to_one(): exec(compile("globvarq = 2","setglobal","exec"), globals())
内容的提问来源于stack exchange,提问作者Sashank Varma Datla
相关产品推荐
相关产品推荐

