Python闭包

1. 极简定义

闭包 = 嵌套函数 + 内层函数引用外层函数的变量 + 外层函数返回内层函数

简单说:内层函数记住并携带了外层函数的 “环境变量”,即使外层函数执行结束,由于内层函数被返回,这些变量也不会被销毁。

2. 闭包三要素(必须同时满足)

  1. 函数嵌套定义(函数里定义函数)
  2. 内层函数引用外层函数的非全局变量
  3. 外层函数返回内层函数对象
    注意:func()返回的是该函数的返回值的对象,而func返回的才是函数对象

闭包代码示例

# 外层函数
def outer(x):
    # 外层函数的局部变量
    msg = "我是外层变量"
    
    # 内层函数(闭包核心)
    def inner():
        # 内层引用外层变量
        print(f"{msg},x的值是:{x}")
    
    # 外层返回内层函数对象(形成闭包)
    return inner

# 调用 outer,得到 inner 函数对象
func = outer(100)
# 执行 inner,依然能访问 outer 的变量!
func()

运行结果

我是外层变量,x的值是:100

闭包的作用

  1. 通过延长外部函数的局部变量生命周期从而保留状态(比如计数器、累加器)
  2. 装饰器的底层原理(装饰器本质就是闭包)
  3. 数据隐藏 / 封装(比类更轻量)

重点:闭包中的Python 内存管理

1. Python 内存回收基本规则

Python 使用 引用计数 + 垃圾回收(GC) 管理内存:

  • 一个对象被引用 → 引用计数 +1
  • 引用消失 → 引用计数 -1
  • 计数 = 0 → 对象立即被销毁、释放内存

普通函数执行完 → 局部变量引用消失 → 内存释放

2.但闭包打破了这个规则

在闭包中,内部函数引用外部函数的局部变量,并且内部函数在外部函数执行后被返回,这个变量的引用就会一直被内部函数持有而不销毁,会一直占用内存

3. 闭包内存释放规则

闭包占用的内存什么时候释放?

  • 闭包函数对象被删除
  • 程序结束

更多推荐