15.Python闭包
闭包
引入
想想看怎样用程序实现下面的功能呢?
在一个聊天软件中显示是谁发送了这条信息,即:一条信息标记了是谁发送的
今天我们要研究的知识点是闭包,实现上述功能的方式可能有多种,但是闭包会更简单。
问题解决
普通方式
1 | def say(user_name, content): |
运行效果如下:
1 | (安娜):今天吃了么? |
小总结:
- 上述代码已经实现了要求,但是每次发送信息时需要将用户名称传递到
say函数中,相对比较麻烦
面向对象的方式解决上述问题
1 | class Person(object): |
运行结果:
1 | (安娜):今天吃了么? |
小总结:
- 通过面向对象的方式能够实现上述要求,但是发现使用了类以及对象,总体感觉还是较为复杂,再者说继承的
object类中有很多默认的方法,既然这个程序不需要,显然会造成一定的浪费
使用闭包解决上述问题
1 | def person(name): |
函数引用
1 | # 定义函数可以理解为: |
运行结果:
1 | --- in test func---- |
闭包的概念
闭包(closure) 定义非常抽象,很难看懂
下面尝试从概念上去理解一下闭包:
- 在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中,这些私有变量能够保持其持久性。 —— 维基百科
https://zh.wikipedia.org/wiki/闭包_(计算机科学)
用比较容易懂的人话说:就是当某个函数被当成对象返回时,夹带了外部变量,就形成了一个闭包。可以这样理解,闭包就是能够读取其他函数内部变量的函数
看如下案例,便于理解什么是闭包:
1 | def make_printer(msg): # 可以认为是 外部函数 |
运行结果:
1 | Good |
闭包案例
代码示例:
1 | def test(number): |
运行结果:
1 | in test_in 函数, number_in is 100 |
使用闭包需要注意的问题
由于闭包会携带包含它的函数的作用域,因此会比其他函数占用更多的内存。因此可以手动解除对匿名函数的引用,以便释放内存。
使用闭包修改外部函数中的变量
1 | def counter(start=0): |
运行结果:
1 | 6 |
多个闭包
如上面的代码中,调用了2次counter,也就意味着创建了2个闭包,并且每个闭包之间没有任何关系。
大家是否有种感觉,好像闭包与对象有些类似。确实是这样的,对象其实可通俗的理解为数据(属性) + 功能(方法),而闭包也可以理解为数据 + 功能,只不过此时数据是外部函数中的那些局部变量或者形参,而功能则是内部函数。对象适合完成较为复杂的功能,而闭包则更轻量
闭包总结
- 闭包定义是在函数内再嵌套函数
- 闭包是可以访问另一个函数局部作用域中变量的函数
- 闭包可以读取另外一个函数内部的变量
- 闭包可以让参数和变量不会被垃圾回收机制回收,始终保持在内存中(而普通的函数调用结束后 会被Python解释器自动释放局部变量)
- 标题: 15.Python闭包
- 作者: Jinshuo Jiang
- 创建于 : 2025-09-30 21:58:42
- 更新于 : 2025-09-30 21:59:29
- 链接: https://redefine.ohevan.com/2025/09/30/Python-Closure/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论