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

Python全局与局部变量冲突时解释器判断局部变量的原理

foo = 1
def bar():
    print(foo)
    foo = 5
解释器判定foo为局部变量的规则

Python采用**静态作用域(词法作用域)**的变量绑定规则,对函数内的变量作用域判定完全基于代码的静态结构,和运行时的执行顺序无关:
只要函数内部任意位置出现了对某变量的赋值操作(包括隐式赋值,比如参数定义、import导入、for循环变量赋值等),解释器就会默认将该变量标记为当前函数的局部变量,整个函数范围内对该变量的访问都会优先查找局部作用域,不会 fallback 到外层全局作用域。

你给出的代码中bar函数内存在foo = 5的赋值语句,因此解释器直接将函数内所有的foo都判定为局部变量,运行print(foo)时局部foo还没有完成赋值,就会抛出UnboundLocalError。

如果需要强制让解释器将foo识别为全局变量,可以在函数开头添加声明:

def bar():
    global foo
    print(foo)
    foo = 5
函数正式执行前的预处理操作

解释器在定义函数阶段(也就是首次读到def关键字解析函数的时候,还没有调用函数)就会完成以下预处理:

  • 语法解析检查:扫描函数内的所有代码,排查语法错误,存在语法问题会直接抛出SyntaxError,不会进入后续处理流程
  • 作用域静态分析:遍历函数内所有的标识符,统计所有被赋值、被定义为参数、通过import引入的变量,将这些变量标记为局部变量,存入函数的__code__.co_varnames属性中,也就是局部变量表
  • 字节码生成:将函数的Python代码转换为解释器可执行的字节码,根据之前的作用域分析结果,给变量访问生成对应的指令:局部变量对应LOAD_FAST/STORE_FAST指令,全局变量对应LOAD_GLOBAL/STORE_GLOBAL指令。你给出的例子中print(foo)对应的字节码就是LOAD_FAST 'foo',运行时只会查找局部变量表,找不到已赋值的变量就会报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:36:05