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

为何Python函数内使用vars()访问外部变量会触发KeyError?

为什么使用vars()在函数内部获取全局变量会抛出KeyError?

首先先重现你的代码和问题:

korean = 'ko-KR'
lgf = 'korean'
def translate(x):
    lgfn = vars()[x]
    return lgfn
translate(lgf)

运行后确实会抛出KeyError: 'korean',和你描述的一致。

问题根源

你踩了一个很容易忽略的细节:不带参数调用vars()时,它的返回值取决于当前的作用域:

  • 在全局作用域(函数外部)调用vars(),返回的是全局命名空间的字典,这时候你能拿到korean变量;
  • 在函数内部调用vars(),默认返回的是当前函数的局部命名空间字典,而你的korean是定义在全局作用域的,局部命名空间里根本没有这个键,自然就抛出KeyError了。

解决方案

这里有几个靠谱的解决办法,你可以根据需求选:

1. 使用globals()代替vars()

globals()函数不管在哪个作用域调用,都会返回全局命名空间的字典,刚好匹配你的需求:

korean = 'ko-KR'
lgf = 'korean'
def translate(x):
    lgfn = globals()[x]
    return lgfn
print(translate(lgf))  # 输出:ko-KR

2. 直接传递变量值(更推荐)

如果不是必须通过变量名字符串来获取值,直接把变量值传给函数会更符合Python的函数封装原则,也避免了对全局作用域的依赖:

korean = 'ko-KR'
lgf = korean  # 直接传递变量值,而非变量名
def translate(x):
    return x
print(translate(lgf))  # 输出:ko-KR

3. 明确指定全局作用域(不推荐)

如果你一定要用vars(),可以通过vars(__main__)来获取全局命名空间,但这种写法不如globals()直观,一般不建议使用:

korean = 'ko-KR'
lgf = 'korean'
def translate(x):
    lgfn = vars(__main__)[x]
    return lgfn
print(translate(lgf))  # 输出:ko-KR

内容的提问来源于stack exchange,提问作者Tanaka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:40:20