命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的。
命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。
目录
1. 命名空间(Namespace)
命名空间是变量名到对象的映射,Python 使用命名空间来组织变量名,避免命名冲突。
1.1 命名空间的类型
-
内置命名空间(Built-in Namespace):
-
包含 Python 内置函数和异常名称
-
在解释器启动时创建,程序退出时销毁
-
如
print()
,len()
,TypeError
等
-
-
全局命名空间(Global Namespace):
-
包含模块级别定义的名称
-
在模块被导入时创建,通常持续到解释器退出
-
包括模块中定义的函数、类、变量等
-
-
局部命名空间(Local Namespace):
-
包含函数内部定义的名称
-
在函数调用时创建,函数返回或抛出异常时销毁
-
包括函数的参数和局部变量
-
1.2 命名空间的访问顺序
Python 使用 LEGB 规则查找名称:
-
Local - 当前函数/方法内部
-
Enclosing - 闭包函数外围
-
Global - 模块级别
-
Built-in - 内置名称
x = 'global x'
def outer():
x = 'outer x'
def inner():
x = 'inner x'
print(x) # 输出 'inner x' (Local)
inner()
print(x) # 输出 'outer x' (Enclosing)
outer()
print(x) # 输出 'global x' (Global)
print(len) # 输出 <built-in function len> (Built-in)
2. 作用域(Scope)
作用域是命名空间可直接访问的代码区域,决定了变量的可见性。
2.1 作用域类型
-
局部作用域(Local Scope):
-
在函数内部
-
只能访问局部变量
-
-
闭包作用域(Enclosing Scope):
-
对于嵌套函数,外部函数的作用域
-
使用
nonlocal
关键字修改
-
-
全局作用域(Global Scope):
-
模块级别
-
使用
global
关键字在函数内修改全局变量
-
-
内置作用域(Built-in Scope):
-
最外层,包含内置名称
-
2.2 作用域相关关键字
-
global:
x = 10 def modify_global(): global x x = 20 modify_global() print(x) # 输出 20
-
nonlocal (Python 3+):
def outer(): x = 10 def inner(): nonlocal x x = 20 inner() print(x) # 输出 20 outer()
3. 命名空间与作用域的重要特性
-
命名空间是动态的:
-
可以在运行时添加、修改命名空间中的名称
-
使用
globals()
和locals()
函数访问对应命名空间的字典
-
-
每个模块有自己的全局命名空间:
-
不同模块的同名变量不会冲突
-
-
类定义会创建新的命名空间:
-
类属性存储在这个命名空间中
-
-
实例有自己的命名空间:
-
实例属性存储在实例的命名空间中
-
4. 示例代码
# 命名空间示例
def namespace_demo():
print("局部命名空间:", locals())
print("全局命名空间:", globals())
namespace_demo()
# 作用域链示例
x = 'global'
def outer():
x = 'outer'
def inner():
x = 'inner'
print("inner:", x)
inner()
print("outer:", x)
outer()
print("global:", x)
# 修改作用域变量
def scope_modification():
global x
x = 'modified global'
def inner():
nonlocal y # 这里会报错,因为没有外围非全局作用域
y = 20
y = 10
inner()
print(y)
scope_modification()
print(x)
理解 Python 的命名空间和作用域对于编写清晰、可维护的代码非常重要,特别是在处理大型项目时。