Python变量查找遵循LEGB规则:按Local(局部)、Enclosing(嵌套)、Global(全局)、Built-in(内置)顺序逐层向上搜索,理解该规则有助于预测变量值、避免命名冲突、提升代码清晰度。

Python变量查找遵循LEGB规则,即按Local(局部)、Enclosing(嵌套)、Global(全局)、Built-in(内置)的顺序逐层向上搜索。理解这个模型,能帮你准确预测变量值、避免命名冲突、写出更清晰的代码。
Local:函数内部定义的变量
在函数体内用赋值语句创建的变量,默认属于局部作用域。每次调用函数都会新建一个局部作用域,函数退出后变量自动销毁。
- 即使和全局变量同名,赋值操作也会新建局部变量(不会修改全局变量)
- 想在函数内修改全局变量,需显式声明global 变量名
- 函数内读取未赋值的变量,会向上一层查找(不触发UnboundLocalError);但只要函数中对该变量有赋值,Python就默认它为局部变量——此时若在赋值前读取,会报UnboundLocalError
Enclosing:嵌套函数中的外层函数作用域
当一个函数定义在另一个函数内部时,内层函数可以访问外层函数的变量,这种非全局又非局部的范围叫Enclosing作用域。
- 外层函数返回内层函数(闭包)时,内层函数仍能记住并使用外层函数的变量值
- 想在内层函数中修改外层变量,需用nonlocal 变量名声明
- nonlocal只能用于嵌套函数,不能用于修改全局变量
Global:模块顶层定义的变量
在.py文件最外层(不在任何函数或类中)定义的变量,属于该模块的全局作用域。同一模块内所有函数默认可读取全局变量。
立即学习“Python免费学习笔记(深入)”;
- 全局变量在整个模块生命周期内有效,不同函数可共享其值
- 函数内对全局变量赋值,会创建同名局部变量;要修改原全局变量,必须写global x
- import导入的模块名、函数名也属于全局作用域
Built-in:Python预定义的名字
Python启动时自动加载的一组内置名称,比如print、len、int、Exception等。它们位于作用域链最末端,仅当前面三层都找不到时才启用。
- 尽量避免用内置名作变量名(如写list = [1,2]),否则会遮盖内置类型,引发隐蔽错误
- 可通过dir(__builtins__)查看当前内置名称列表
- 内置作用域不可直接赋值修改,但可以通过del删除(不推荐)
LEGB不是语法强制,而是名字解析的隐式逻辑。写代码时,优先考虑用参数传入数据、减少对全局/外层变量的依赖,能让作用域边界更清晰,调试和测试也更容易。










