这套课程按知识依赖排列。本篇的前置知识是:第 23 篇。学完后,你应该能够判断变量在函数内外的可见范围。
本篇要解决的问题
本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6,在 macOS 环境核验;除明确标注的终端命令外,代码本身只使用 Python 标准能力。
先看清一个容易误解的细节
Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找,找到后停止。这个顺序常简称 LEGB。
核心概念
- 函数内部赋值默认创建局部变量。
- 尽量通过参数和返回值传递数据,少依赖可修改的全局状态。
global与nonlocal会改变赋值目标,基础代码中应谨慎使用。
跟着示例运行
把下面代码保存到本课脚本并运行:
course = "Python"
def outer():
level = "基础"
def show():
lesson = "作用域"
print(course, level, lesson)
show()
outer()
预期结果:
Python 基础 作用域
输出中包含环境路径、集合元素或日志格式时,具体文字和顺序可能随本机环境变化;判断是否成功应以本篇说明的关键结果为准。
按执行顺序拆开看
show()中查找lesson时先在局部找到,查找level时到外层outer()找到。course在局部和外层都不存在,继续到模块全局找到;print最后在内置作用域找到。
再看一个具体细节
内层重新使用同一个变量名时,会遮蔽外层名字。
查找在最近作用域已经找到结果后就停止;外层同名变量仍存在,只是当前表达式没有继续查找它。
初学者容易混淆的地方
- 在函数内部赋值同名变量后仍期待修改全局变量;默认会创建局部绑定。
- 大量使用全局可变状态,让函数结果依赖隐含环境,难以测试和复用。
练习
- 在内外层定义同名变量,观察最近作用域优先。
- 尝试在函数外访问局部变量,记录异常类型。
练习应先独立完成,再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力,不要求提前搜索复杂写法。
本篇边界
本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程;先确保能够解释示例中每一行代码,再进入下一篇。
相关文章
01|Python 程序从源码到输出经历了什么
面向按顺序学习 Python 的初学者,本篇在零基础上,帮助读者理解源代码、解释器和输出之间的关系。
02|在 macOS 安装并确认 Python 3 环境
面向按顺序学习 Python 的初学者,本篇在第 01 篇知识上,帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。
03|交互式解释器和 Python 脚本怎么选择
面向按顺序学习 Python 的初学者,本篇在第 02 篇知识上,帮助读者根据任务选择 REPL 或 `.py` 脚本。
04|建立第一个 Python 项目目录
面向按顺序学习 Python 的初学者,本篇在第 03 篇知识上,帮助读者理解当前目录并正确运行项目脚本。

