什么是 Python 的闭包?

Python 的闭包(Closure)

1. 闭包的定义

在 Python 中,闭包(Closure) 指的是在一个函数内部定义另一个函数,并且内部函数引用了外部函数的变量,即使外部函数执行完毕后,内部函数依然可以访问这些变量。

2. 闭包的构成条件

要形成闭包,需要满足以下 3 个条件

  1. 嵌套函数(一个函数内部定义了另一个函数)。
  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 代码更加简洁、高效! 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值