变量作用域(局部、全局和非局部)
项目:构建一个“计数器跟踪器”应用程序,以探索变量作用域的行为。
01. 学习目标
通过本课的学习,你将能够:
- 理解局部、全局和非局部变量的工作原理
- 识别函数内外的变量可见性
- 正确使用
global和nonlocal关键字 - 应用LEGB规则来预测变量访问顺序
02. 问题场景
你正在创建一个小程序,用于计算一个函数被调用的次数。
在此过程中,你注意到一些变量消失或未按预期更新。
让我们探索作用域——控制变量可以被访问的概念。
03. 第一步 – 局部变量
在函数内部声明的变量仅在该函数执行期间存在。
def show_number():
x = 10 # 局部变量
print("Inside function:", x)
show_number()
# print(x) # 错误!(x 在外部未定义)
当函数结束时,局部变量会被销毁。
04. 第2步 – 全局变量
在任何函数外部声明的变量可以在程序的任何地方使用。
y = 20 # 全局变量
def print_global():
print("在函数内部:", y)
print_global()
print("在函数外部:", y)
全局变量在整个程序中持续存在。
05. 第三步 – 修改全局变量
如果你想在函数内部改变一个全局变量,请使用global关键字。
count = 0
def increase():
global count
count += 1
increase()
increase()
print(count) # 2
⚠️ 避免过度使用 global。这会使你的代码 难以调试。
06. 第4步 – 局部与全局命名冲突
如果局部变量和全局变量共享相同的名称,
局部变量在 函数内部 优先级更高。
x = 100
def test():
x = 50 # 局部变量(遮蔽了全局变量)
print("在函数内部:", x)
test()
print("在函数外部:", x)
# 内部函数: 50 # 外部函数: 100
07. 第5步 – LEGB规则
当Python查找一个变量时,它遵循以下顺序:
| 级别 | 描述 |
|---|---|
| L (局部) | 在当前函数内部 |
| E (封闭) | 在外部(封闭)函数内部 |
| G (全局) | 在任何函数外部定义 |
| B (内置) | Python的内置名称 |
x = “global”
def outer():
x = “enclosed”
def inner():
x = “local”
print(x) # local
inner()
print(x) # enclosed
outer()
print(x) # global
08. 第6步 – nonlocal 关键字
nonlocal 允许修改封闭(外部)函数中的变量,
但不允许修改全局变量。
def outer():
x = "enclosed"
def inner():
nonlocal x
x = "changed"
print("inner:", x)
inner() print("outer:", x)
outer()
09. 第七步 – 实践示例
示例 1: 局部变量与全局变量
a = 5
def func():
a = 10
print("在函数内部:", a)
func()
print(“在函数外部:“, a)
示例 2: 使用全局变量
counter = 0
def add():
global counter counter += 1
add()
add()
print(counter) # 2
示例 3:使用 nonlocal
def outer():
msg = "Hello"
def inner(): nonlocal msg msg = "Hi" inner() print(msg)
outer()
10. 第8步 – 迷你项目:计数器追踪应用
构建一个函数,用于计算它被调用的次数,
使用 global 和 nonlocal 概念。
count = 0
def counter_app():
global count
count += 1
print(f"函数被调用 {count} 次。")
for _ in range(3):
counter_app()
附加内容 – 使用非局部变量(函数版本)
def make_counter():
count = 0
def increment():
nonlocal count
count += 1
print(f"计数器: {count}")
return increment
counter = make_counter()
counter()
counter()
counter()
11. 反思
您已经学习了如何:
- 区分局部、全局和非局部变量
- 根据LEGB规则预测变量行为
- 安全地更新全局和封闭变量
- 构建一个计数器跟踪应用以可视化作用域的实际应用

