
1. 闭包(Closure)
- 定义:闭包是一个函数与其"捕获"的外部变量(来自外层作用域的变量)的组合。即使外层函数已经执行完毕,内部函数仍能记住并访问这些变量。
- 核心机制:当内层函数引用了外层函数的变量时,Python 会将这些变量绑定到闭包中,使其生命周期延长至闭包存在期间。
例子:
python
def outer():
x = 10 # 外层函数的变量
def inner():
print(x) # 内层函数捕获了外层变量x
return inner
closure = outer() # outer()执行完毕,x本应被销毁
closure() # 输出:10 → 但闭包仍然能访问x!
- 关键点 :
- 闭包的本质是 函数 + 环境变量 的捆绑。
- 闭包中的变量是"记忆"的,而非实时查找的(注意循环陷阱,如延迟绑定问题)。
2. 作用域(Scope)
Python 使用 LEGB 规则 查找变量:
- L(Local):当前函数内部。
- E(Enclosing):外层嵌套函数(闭包的关键!)。
- G(Global):模块全局作用域。
- B(Built-in) :内置函数(如
print
,len
)。
例子:
python
x = "global"
def outer():
x = "outer"
def inner():
x = "inner"
print(x) # 输出:inner (Local优先)
inner()
print(x) # 输出:outer (Enclosing)
outer()
print(x) # 输出:global (Global)
- 闭包与作用域的联动 :
当内层函数访问外层函数的变量时,Python 会将这些变量"冻结"到闭包中,即使外层函数已执行完毕,闭包仍能通过 Enclosing作用域 访问它们。
总结
- 闭包:是函数式编程的核心概念,让函数能"记住"外部状态,是装饰器实现的基础。
- 作用域:通过 LEGB 规则控制变量的可见性,闭包通过 Enclosing 作用域实现变量捕获。