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

Python函数中exec('global var', globals())与global var的区别是什么

核心原理

Python的函数变量作用域是在**编译阶段(也就是函数定义完成时)**就确定的,不是运行时动态判定的:

  • 编译函数时,解释器会扫描所有直接写在函数体里的赋值操作,只要某变量被直接赋值,就会被默认标记为局部变量,后续所有对该变量的读写都会优先找局部作用域里的对象。
  • exec是运行时才会执行的动态代码语句,编译阶段解释器完全看不到exec内部的代码内容,所以exec里的global声明,完全影响不了编译阶段已经完成的作用域标记结果。

第一段代码报错的原因

第一段代码的test函数在编译阶段就扫描到了var += 1这个直接赋值操作,所以直接把var标记为了test的局部变量。
运行时执行的exec('global var', globals())虽然确实在全局命名空间里标记了var是全局变量,但改变不了已经确定的「test里直接写的var是局部变量」的判定,运行到var +=1时会先尝试读取局部变量var的值做累加,此时局部var还没赋值,自然抛出UnboundLocalError。

第二段代码正常运行的原因

第二段代码里,var += 1的操作也是放在exec里执行的,而且你给两个exec都传入了globals()作为执行时的命名空间:

  • 所有exec内的代码读写变量都会直接操作全局命名空间,不会和test的局部作用域产生任何关联,自然不会触发局部变量未赋值的报错。
  • 执行完后全局变量var会被正确累加为2,最后print(var)会输出预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 11:57:03