Python3 命名空间/作用域¶
概念与用途¶
命名空间是名称到对象的映射,作用域决定当前代码可直接访问哪些名称。Python 按 LEGB 顺序查找:Local、Enclosing、Global、Built-in。
核心语法¶
赋值默认创建局部名称;global 修改模块级名称,nonlocal 修改最近的闭包名称。闭包能让内部函数记住外层函数调用中的状态。
def make_counter():
count = 0
def increment() -> int:
nonlocal count
count += 1
return count
return increment
counter = make_counter()
print(counter(), counter())
LEGB 规则¶
| 层级 | 来源 | 生命周期 |
|---|---|---|
| Local | 当前函数调用 | 调用期间 |
| Enclosing | 外层函数闭包 | 被闭包引用期间 |
| Global | 当前模块 | 模块对象期间 |
| Built-in | builtins 模块 |
解释器期间 |
示例:避免遮蔽内置名称¶
import builtins
values = [1, 2, 3]
total = builtins.sum(values)
print(total)
def describe(value: int) -> str:
label = "local"
return f"{label}: {value}"
print(describe(4))
不要把变量命名为 list、sum、id 等常用内置名称。静态检查工具能发现部分遮蔽问题,但清晰命名仍是最有效的预防方式。
常见错误与工程注意¶
- 在函数内给名称赋值会使其成为局部变量,赋值前读取可能触发
UnboundLocalError。 - 少用
global共享可变状态,优先参数、返回值或对象封装。 - 闭包循环变量存在晚绑定问题,可通过默认参数或辅助函数捕获当前值。