为何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
相关产品推荐
相关产品推荐

