首页 › 论坛 › 置顶 › Python基础 :变量作用域
正在查看 1 个帖子:1-1 (共 1 个帖子)
-
作者帖子
-
2025-11-06 10:07 #27226Q QPY课程团队管理员
变量作用域(局部、全局和非局部)
项目:构建一个“计数器跟踪器”应用程序,以探索变量作用域的行为。
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) # enclosedouter()
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 = 10print("在函数内部:", a)func()
print(“在函数外部:“, a)示例 2: 使用全局变量
counter = 0def 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规则预测变量行为
- 安全地更新全局和封闭变量
- 构建一个计数器跟踪应用以可视化作用域的实际应用
-
作者帖子
正在查看 1 个帖子:1-1 (共 1 个帖子)
- 哎呀,回复话题必需登录。