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

Python中local与global变量相关代码运行结果差异问题求解释

核心原因:Python 函数的变量作用域是在编译阶段静态判定的,不是运行时逐行判定的

Python 编译函数代码的阶段,只要函数内部任意位置出现了对某个变量的赋值操作(没有显式声明 global/nonlocal 的前提下),就会把这个变量标记为当前函数的局部变量,后续所有对该变量的访问都会优先找局部作用域的变量,不会回退到全局作用域查找。


第一个报错代码的运行逻辑

def callme():
    print(x)
    x=20
x=10
callme()
  • 编译callme函数时,检测到函数内有x=20的赋值语句,因此直接将x标记为callme的局部变量。
  • 调用callme执行到print(x)时,程序只会查找局部作用域的x,但此时局部的x还没有完成赋值,因此直接抛出UnboundLocalError: local variable 'x' referenced before assignment错误。

第二个正常运行代码的运行逻辑

def callme():
    print(x)
x=10
callme()
  • 编译callme函数时,检测到函数内部没有对x的赋值操作,因此判定x属于上层作用域的变量。
  • 调用callme执行到print(x)时,程序向上查找到全局作用域的x=10,因此正常输出10。

如果要让第一个代码也能正常访问全局x,需要显式声明x是全局变量,修改后代码如下:

def callme():
    global x
    print(x)
    x=20
x=10
callme() # 输出10,运行后全局x的值会被修改为20

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:54:05