python exec在局部域中失效的问题
start at 2022/10/27?

问题

exec是python的内置函数,功能是输入一个字符串参数,然后执行字符串的命令,返回值永远是None

例如

exec("a=233")
print(a)

就会输出233

但是使用过程中会出现问题,在一个函数中,如果没有事先申明a的值,程序就会抛出错误a is not defined,如果事先申明了,他也只会打印申明的值,不会被exec改变

上网查了原因

在函数里面, 传递给 exec() 的局部范围是拷贝实际局部变量组成的一个字典。 因此,如果 exec() 如果执行了修改操作,这种修改后的结果对实际局部变量值是没有影响的

解决方案

def f():
    exec("a=233")
    print(locals()['a'])

当你调用 locals() 获取局部变量时,你获得的是传递给 exec() 的局部变量的一个拷贝

当然作为locals()的替代方案,你也可以使用你自己的字典传递给exec()

def f():
    a=1
    loc={'a':a}
    glb={}
    exec('b=a+1',glb,loc)
    b=loc['b']
    print(b)

总的来说还是挺麻烦的,也没太搞懂原理,尽量少用吧

2022/10/27
> CLICK TO back <