函数闭包
什么是闭包?
- 内部函数对外部函数作用域里对象的引用(非全局变量),则称内部函数为闭包
- 一个闭包就是你调用了外部函数,外部函数返回内部函数,此时的内部函数就叫做闭包函数
- 闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例
闭包简单示例:
1
|
def wai():
|
通过这个例子大家可以看到,在外部函数中,本应该在wai函数执行完死掉的变量a,由于此时有了 内部函数的引用,从而使得这个变量并不会死去,而是类似于继承一样,通过nei函数又存活了下来
接着让我们愉快的看下一个例子,继续理解闭包
1
|
num = 1 #全局变量num
|
三次闭包函数的执行结果,我们来看一下吧
1
|
2
|
分析一下,这里出现的结果
首先三次值都是在全局变量num的基础上做累加 a 的操作
说明在闭包函数对象res存活期间,a变量将会一直存活
最后我们以将一个可变数据对象作为闭包引用的变量为例
1
|
def func(obj): #接收可变数据对象作为参数
|
执行的结果
1
|
[1, 2, 3, 4, 5]
|
闭包思考:
- 闭包私有化了变量,实现了类似于面向对象中实例的功能
- 由于闭包引用了外部函数的局部变量,则外部函数中的局部变量没有及时释放,消耗内存
- 在python中,使用闭包的另一个场景就是装饰器,也叫语法糖 @
实现闭包:
- 函数嵌套
- 内部函数对外部函数作用域里对象的引用
- 外部函数返回内部函数对象