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

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

原因分析

  1. globals()的问题:
    函数内定义的var1是局部变量,globals()['var1']修改的是全局命名空间中的var1,二者并非同一变量,因此函数返回的局部var1仍为空字符串。

  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:10:57