第 25 课 · 阶段四 · 函数与模块
变量作用域
变量在哪里能访问,由作用域决定。这一课理清局部/全局作用域,掌握 global 与 nonlocal 的用法与风险。
🎯 学完本课你将掌握
- 区分局部变量与全局变量
- 理解 global 与 nonlocal 的用途
- 看懂嵌套函数的作用域规则(LEGB)
一、局部变量:只在函数内有效
局部变量.py
1def f():2 x = 10 # 局部变量3 print(x)45f() # 106# print(x) # 报错!NameError: x 在外面不存在二、全局变量:整个模块可见
全局变量.py
1x = 100 # 全局变量23def show():4 print(x) # 函数内可以读取全局变量56show() # 1007print(x) # 100三、函数内修改全局变量:需要 global
global 用法.py
1count = 023def add_one():4 global count # 声明我要修改全局变量5 count += 167add_one()8add_one()9print(count) # 2⚠️ 注意
不加 global 时,函数内 count += 1 会被当成“新建局部变量”,报 UnboundLocalError。读到需小心,修改必须先声明 global。
四、嵌套函数与 nonlocal
nonlocal.py
1def outer():2 n = 103 def inner():4 nonlocal n # 修改外层函数的变量5 n += 56 inner()7 print(n) # 1589outer()五、LEGB 查找规则
Python 找变量按顺序:L 局部 → E 外层函数 → G 全局 → B 内置。就近原则,先到先得。
LEGB 演示.py
1x = "全局"23def outer():4 x = "外层"5 def inner():6 x = "局部"7 print(x) # 局部(L优先)8 inner()910outer()六、什么时候不该用 global
💡 提示
新手建议:函数尽量只通过参数接收、return 返回,不要依赖 global,否则代码难读难测。global 常用于计数器、配置开关等少数场景。
七、常见错误与解决
常见错误与解决
| 错误现象 | 原因 / 解决方法 |
|---|---|
UnboundLocalError: local variable 'x' referenced before assignment | 函数内既读了又写了全局变量,未声明 global。 |
改了全局变量但外面没变 | 函数内赋值没加 global,Python 认为你在新建局部变量。 |
nonlocal 用错位置 | nonlocal 只能用在嵌套函数内,且目标变量必须在外层存在。 |
✍️ 小练习
写一个计数器:函数内部每次调用 +1 并返回当前值,要求用 global 或闭包(函数内定义函数)实现,并解释两种方式的差别。
📌 本节小结
局部变量藏在函数内,全局变量全局可见;函数内修改全局要用 global、修改外层函数变量用 nonlocal;查找顺序是 LEGB。尽量用参数+返回值,少用全局。