第 25 课 · 阶段四 · 函数与模块

变量作用域

变量在哪里能访问,由作用域决定。这一课理清局部/全局作用域,掌握 global 与 nonlocal 的用法与风险。

第 25 课阶段四 · 函数与模块难度:进阶建议时长:30 分钟关键词:局部 · 全局 · global · nonlocal

🎯 学完本课你将掌握

  • 区分局部变量与全局变量
  • 理解 global 与 nonlocal 的用途
  • 看懂嵌套函数的作用域规则(LEGB)

一、局部变量:只在函数内有效

局部变量.py
1def f():
2 x = 10 # 局部变量
3 print(x)
4
5f() # 10
6# print(x) # 报错!NameError: x 在外面不存在

二、全局变量:整个模块可见

全局变量.py
1x = 100 # 全局变量
2
3def show():
4 print(x) # 函数内可以读取全局变量
5
6show() # 100
7print(x) # 100

三、函数内修改全局变量:需要 global

global 用法.py
1count = 0
2
3def add_one():
4 global count # 声明我要修改全局变量
5 count += 1
6
7add_one()
8add_one()
9print(count) # 2
⚠️ 注意
不加 global 时,函数内 count += 1 会被当成“新建局部变量”,报 UnboundLocalError。读到需小心,修改必须先声明 global。

四、嵌套函数与 nonlocal

nonlocal.py
1def outer():
2 n = 10
3 def inner():
4 nonlocal n # 修改外层函数的变量
5 n += 5
6 inner()
7 print(n) # 15
8
9outer()

五、LEGB 查找规则

Python 找变量按顺序:L 局部 → E 外层函数 → G 全局 → B 内置。就近原则,先到先得。

LEGB 演示.py
1x = "全局"
2
3def outer():
4 x = "外层"
5 def inner():
6 x = "局部"
7 print(x) # 局部(L优先)
8 inner()
9
10outer()

六、什么时候不该用 global

💡 提示
新手建议:函数尽量只通过参数接收、return 返回,不要依赖 global,否则代码难读难测。global 常用于计数器、配置开关等少数场景。

七、常见错误与解决

常见错误与解决

错误现象原因 / 解决方法
UnboundLocalError: local variable 'x' referenced before assignment函数内既读了又写了全局变量,未声明 global。
改了全局变量但外面没变函数内赋值没加 global,Python 认为你在新建局部变量。
nonlocal 用错位置nonlocal 只能用在嵌套函数内,且目标变量必须在外层存在。
✍️ 小练习
写一个计数器:函数内部每次调用 +1 并返回当前值,要求用 global 或闭包(函数内定义函数)实现,并解释两种方式的差别。
📌 本节小结
局部变量藏在函数内,全局变量全局可见;函数内修改全局要用 global、修改外层函数变量用 nonlocal;查找顺序是 LEGB。尽量用参数+返回值,少用全局。