闭包中的Python内存管理
·
Python闭包
1. 极简定义
闭包 = 嵌套函数 + 内层函数引用外层函数的变量 + 外层函数返回内层函数
简单说:内层函数记住并携带了外层函数的 “环境变量”,即使外层函数执行结束,由于内层函数被返回,这些变量也不会被销毁。
2. 闭包三要素(必须同时满足)
- 函数嵌套定义(函数里定义函数)
- 内层函数引用外层函数的非全局变量
- 外层函数返回内层函数对象
【注意: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
闭包的作用
- 通过延长外部函数的局部变量生命周期从而保留状态(比如计数器、累加器)
- 装饰器的底层原理(装饰器本质就是闭包)
- 数据隐藏 / 封装(比类更轻量)
重点:闭包中的Python 内存管理
1. Python 内存回收基本规则
Python 使用 引用计数 + 垃圾回收(GC) 管理内存:
- 一个对象被引用 → 引用计数 +1
- 引用消失 → 引用计数 -1
- 计数 = 0 → 对象立即被销毁、释放内存
普通函数执行完 → 局部变量引用消失 → 内存释放
2.但闭包打破了这个规则!
在闭包中,内部函数引用外部函数的局部变量,并且内部函数在外部函数执行后被返回,这个变量的引用就会一直被内部函数持有而不销毁,会一直占用内存
3. 闭包内存释放规则
闭包占用的内存什么时候释放?
- 闭包函数对象被删除
- 程序结束
更多推荐
所有评论(0)