Python 的闭包(Closure)
1. 闭包的定义
在 Python 中,闭包(Closure) 指的是在一个函数内部定义另一个函数,并且内部函数引用了外部函数的变量,即使外部函数执行完毕后,内部函数依然可以访问这些变量。
2. 闭包的构成条件
要形成闭包,需要满足以下 3 个条件:
- 嵌套函数(一个函数内部定义了另一个函数)。
- 外部函数有变量被内部函数引用(外部函数的变量不会在内部函数中被重新赋值)。
- 外部函数返回内部函数,并且外部函数执行完后,内部函数依然可以访问外部函数的变量。
3. 闭包示例
def outer_function(x): # 外部函数
def inner_function(y): # 内部函数
return x + y # 引用了外部函数的变量 x
return inner_function # 返回内部函数
调用:
closure_func = outer_function(10) # outer_function 执行完,但 x=10 被记住
print(closure_func(5)) # 10 + 5 = 15
即使 outer_function() 执行结束,inner_function() 仍然可以访问 x=10。
4. 闭包的作用
1)保持变量的状态
闭包可以用来保存函数的状态信息,避免使用全局变量。
示例:计数器
def counter():
count = 0 # 外部变量
def increment():
nonlocal count # 允许修改外部变量
count += 1
return count
return increment
count1 = counter()
print(count1()) # 1
print(count1()) # 2
print(count1()) # 3
解释:
count变量在counter()内部定义,但increment()仍然能访问并修改它(使用nonlocal关键字)。counter()执行后返回increment(),但count依然保留。
2)数据封装
闭包可以隐藏数据,提供类似面向对象的封装特性。
示例:创建一个账户
def create_account(initial_balance):
balance = initial_balance # 外部变量(私有变量)
def transaction(amount):
nonlocal balance
balance += amount
return balance
return transaction
account = create_account(100) # 初始余额 100
print(account(50)) # 存款 50 -> 余额 150
print(account(-30)) # 取款 30 -> 余额 120
balance变量不会暴露给外部,只能通过transaction()访问。
5. nonlocal 关键字
在闭包中,如果需要修改外部函数的变量,需要使用 nonlocal 关键字,否则会创建新的局部变量。
示例:使用 nonlocal 修改变量
def outer():
x = 10
def inner():
nonlocal x
x += 5 # 修改外部变量
print(x)
return inner
func = outer()
func() # 15
6. 闭包 vs. 全局变量
| 对比项 | 闭包 | 全局变量 |
|---|---|---|
| 作用范围 | 仅在闭包内部可访问 | 所有地方都可访问 |
| 封装性 | 提供数据隐藏 | 变量可随意修改 |
| 内存管理 | 只在需要时保留变量 | 可能一直占用内存 |
7. 总结
- 闭包 是一个 返回内部函数 并 引用外部变量 的函数结构。
- 闭包可以保存函数状态、封装数据,避免使用全局变量。
nonlocal关键字用于在内部函数中修改外部函数的变量。
📌 应用场景:
- 计数器
- 装饰器
- 数据封装(模拟类的私有变量)
- 回调函数(如 GUI、Web 开发)
💡 掌握闭包,可以让 Python 代码更加简洁、高效! 🚀

1480

被折叠的 条评论
为什么被折叠?



