Python函数中globals()/locals()/vars()失效问题及解决方法问询
函数内通过globals()/locals()/vars()修改变量不生效的解决办法
问题重现
在全局作用域中,以下代码都能正常修改变量并输出预期结果:
var1, var2 ='', '' globals()['var1']='value1' print(f'{var1=}, {var2=}') var1, var2 ='', '' locals()['var1']='value1' print(f'{var1=}, {var2=}') var1, var2 ='', '' vars()['var1']='value1' print(f'{var1=}, {var2=}')
输出均为:var1='value1', var2=''
但将相同逻辑放入函数后,返回结果始终是('', ''):
def test(): var1, var2 ='', '' globals()['var1']='value1' return var1, var2 def test(): var1, var2 ='', '' locals()['var1']='value1' return var1, var2 def test(): var1, var2 ='', '' vars()['var1']='value1' return var1, var2
原因分析
globals()的问题:
函数内定义的var1是局部变量,globals()['var1']修改的是全局命名空间中的var1,二者并非同一变量,因此函数返回的局部var1仍为空字符串。locals()和vars()的问题:
在函数内部,locals()(vars()在函数内等价于locals())返回的局部命名空间字典是只读的——Python在编译函数时就确定了局部变量列表,修改这个字典不会同步到实际的局部变量,自然无法改变var1的值。
解决方案
方案1:使用字典存储变量(推荐)
放弃直接操作命名空间,改用字典管理变量,这是最清晰且符合Python风格的做法:
def test(): p = {'var1':'', 'var2':''} p['var1']='value1' return p['var1'], p['var2']
方案2:使用exec修改局部变量(不推荐)
虽然可以用exec强制修改局部变量,但会降低代码可读性和可维护性,仅作参考:
def test(): var1, var2 = '', '' exec('var1 = "value1"') return var1, var2
方案3:声明全局变量(仅适用于需要修改全局变量的场景)
如果你的目标是修改全局变量而非局部变量,可以在函数内声明global var1,此时globals()的修改会同步到全局变量,函数返回的也是全局变量的值:
def test(): global var1 var1, var2 = '', '' globals()['var1']='value1' return var1, var2
内容的提问来源于stack exchange,提问作者kay
相关产品推荐
相关产品推荐

