本文目标:掌握Python四层变量引用规则
提出一个小问题,为什么引用全局变量要声明?要理解这个问题,核心是搞懂 Python 的变量作用域规则。
本质原因:Python 严格遵循 LEGB 作用域查找规则,这是变量查找、读取、修改的底层逻辑。
一、Python 的作用域查找规则(LEGB 规则)
Python 查找变量时会按以下顺序找,找到即停止,全程未找到则直接报错。
四层作用域顺序(优先级从高到低):
- L(Local):局部作用域 → 函数内部定义的变量
- E(Enclosing):嵌套外层函数作用域 → 闭包/嵌套函数的外层变量
- G(Global):全局作用域 → 整个程序顶层定义的变量
- B(Built-in):内置作用域 → Python 自带的变量/函数(print、len、range 等)
一句话总结查找顺序:局部 → 嵌套外层 → 全局 → 内置
作用域优先级:局部变量 > 嵌套变量 > 全局变量 > 内置变量
⚠️ 注意:自定义变量可能会覆盖内置名称,不推荐这样使用。
二、全局变量读写规则(重点)
在 Python 中,读取全局变量和修改全局变量的处理逻辑完全不同。
基于 LEGB 规则,Python 对全局变量做了明确区分:
- 嵌套作用域修改变量:必须使用
nonlocal 关键字(进阶知识点)
简单来说:读取全局变量无需声明,修改全局变量必须声明。
三、最佳实践(新手必看)
为了避免作用域混乱、变量冲突,建议遵循以下原则:
文末小互动
你在写代码时,遇到过全局变量报错的坑吗?评论区聊聊~