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

为何Python函数未局部定义变量也未传参,运行却不报错?

Python函数变量作用域问题解答

关键:读取变量和赋值变量的作用域规则不一样

Python查找变量遵循LEGB顺序(局部→嵌套→全局→内置),但核心区别在这:

  • 仅读取变量:函数内部没定义的话,会自动向上查找外层作用域的同名变量
  • 对变量赋值:Python会直接把这个变量标记为当前函数的局部变量,哪怕全局有同名的

第一段代码报错的原因

看这段代码:

def demo():
  print(a)
  a += 5

a = 100
print(a)
demo()
print(a)

a += 5本质是赋值操作(等同于a = a + 5),Python一看到这个,就认定demo里的a是局部变量。但执行print(a)的时候,局部的a还没被赋值(赋值在print之后),所以会抛出UnboundLocalError,提示局部变量在赋值前被引用。

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

再看这段代码:

def demo():
  print(a)

a = 100
print(a)
demo()
print(a)

函数里只有print(a),这是纯读取操作,没有任何赋值行为。Python会按照作用域规则向上查找,在全局作用域找到a = 100,直接使用这个值,自然不会报错,所以输出三次100。

补充:想在函数里修改全局变量怎么办?

如果要在函数内部修改全局变量,得用global关键字声明:

def demo():
  global a
  print(a)
  a += 5

a = 100
print(a)
demo()
print(a)

这样运行后输出就是100、100、105,因为global a告诉Python,函数里的a就是全局作用域的那个变量,不是新的局部变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:22:08