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

Python局部与非局部作用域疑问:三段代码输出差异解惑

Python作用域问题解析

核心规则:函数内局部变量的判定逻辑

只要函数内部存在对变量的赋值操作(比如a = 2),Python在编译函数代码时就会将该变量标记为局部变量,后续函数内对这个变量的所有引用都会优先指向这个局部变量,而非全局变量——哪怕赋值语句出现在引用之后。


示例1分析

a = 10
def myfunc():
    a = 2
    print(a)
print(a)
myfunc()
  • 全局作用域的a = 10是全局变量,外层print(a)直接输出全局值10。
  • 进入myfunc后,a = 2创建了局部变量a,后续print(a)引用的是已赋值的局部变量,因此输出2。

示例2分析

a = 10
def myfunc():
    print(a)
print(a)
myfunc()
  • myfunc内部没有对a的赋值操作,Python会按LEGB规则(局部→嵌套→全局→内置)向上查找,找到全局作用域的a = 10,因此两次输出都是10。

示例3与示例1的核心差异

a = 10
def myfunc():
    print(a)
    a = 2
print(a)
myfunc()
  • 虽然print(a)写在a = 2前面,但Python编译myfunc时,发现函数内存在a = 2的赋值操作,直接将a标记为局部变量。
  • 执行print(a)时,局部变量a还未被赋值,因此抛出UnboundLocalError。这就是和示例1的区别:示例1中print(a)在局部变量赋值之后,而示例3中print(a)在局部变量赋值之前,但函数已将a判定为局部变量,无法再引用全局的a。

如果想让示例3输出10和2,可以用global关键字声明a为全局变量:

a = 10
def myfunc():
    global a
    print(a)
    a = 2
print(a)
myfunc()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 13:17:03