Python命名空间是名字到对象的映射,分为局部、全局和内置三类,按LEGB规则查找;作用域决定可见性,if/for不建新命名空间,class创建独立命名空间,可用locals()、globals()等查看。

Python命名空间就是名字到对象的映射关系,简单说,就是一个“名字→值”的字典。你写的每个变量、函数、类,Python都会把它们的名字和对应的实际对象存进某个命名空间里,用来避免重名冲突,也决定名字在哪儿能用、用的是谁。
命名空间的类型:局部、全局、内置
Python按作用域分三种主要命名空间:
- 局部命名空间(Local):函数或方法内部定义的名字,比如函数参数、内部变量。每次调用函数时新建,调用结束就销毁。
- 全局命名空间(Global):模块层级定义的名字,比如模块顶部的变量、函数、类。一个.py文件对应一个全局命名空间,从导入到程序结束一直存在。
- 内置命名空间(Built-in):Python自带的名字,如print、len、Exception等,所有模块都能访问,优先级最低(只有在局部和全局都找不到时才查它)。
名字查找顺序:LEGB规则
当你写x,Python按固定顺序搜索命名空间:
- Local → 当前函数内部
- Enclosing → 外层嵌套函数(如果有闭包)
- Global → 当前模块顶层
- Built-in → Python内置名字
例如:
立即学习“Python免费学习笔记(深入)”;
Ke361是一个开源的淘宝客系统,基于最新的ThinkPHP3.2版本开发,提供更方便、更安全的WEB应用开发体验,采用了全新的架构设计和命名空间机制, 融合了模块化、驱动化和插件化的设计理念于一体,以帮助想做淘宝客而技术水平不高的朋友。突破了传统淘宝客程序对自动采集商品收费的模式,该程序的自动 采集模块对于所有人开放,代码不加密,方便大家修改。集成淘点金组件,自动转换淘宝链接为淘宝客推广链接。K
x = "global"
def outer():
x = "enclosing"
def inner():
x = "local"
print(x) # 输出 "local"
inner()
这里inner()里的print(x)只看到自己定义的x,不会去外层找——这就是LEGB生效的结果。
命名空间和作用域的关系
命名空间是存储结构,作用域是可见范围。作用域决定了哪个命名空间参与LEGB查找。注意:
- if、for、while这些语句块不创建新命名空间,里面定义的变量仍属于当前函数或模块的命名空间。
- class会创建自己的命名空间,但类内部定义的变量默认是类属性,不是局部变量。
- 用global或nonlocal可以显式修改名字绑定的目标命名空间。
怎么查看当前命名空间?
调试时可以用:
- locals():返回当前局部命名空间的字典(函数内调用)
- globals():返回当前模块的全局命名空间字典
- dir(builtins)(需先import builtins):看内置命名空间内容
比如在函数里打印locals(),就能看到当前有哪些变量及它们的值。










