Python 中的闭包、闭包的同级访问以及闭包保存参数的状态

Python 中的闭包、闭包的同级访问以及闭包保存参数的状态

1、引入闭包
首先,一个问题,我们在函数的外部是无法访问到函数里面的变量 a 的。
在这里插入图片描述
但是我们可以用 return 将这个变量的值返出来,而且必须有一个容器接着。
在这里插入图片描述
在这里,变量 a 和 函数 inner_func 是兄弟关系,同样,我们可以将这个内部函数用 return 扔出来,再用一个容器接着。
在这里插入图片描述
所以,闭包的格式:

1、外部函数中定义了内部函数
2、外部函数是有返回值的
3、返回的值,就是内部函数的名字
4、内部函数引用了外部函数的变量,否则不是完全闭包

2、闭包的同级访问以及闭包保存参数的状态

(1)可以使用同级的作用域,但是不能使用同级里面的变量。比如在 inner_func2里面打印inner_func1里面的变量b,就会报错,但是在 inner_func2里面可以调用inner_func1()
在这里插入图片描述

(2)读取其他元素的内部变量
(3)延长作用域

我们先看一段代码,在调用外部函数,传入2,3之后,没有立刻去调用x(),也就是内部函数,而是再次调用外部函数,传入了4,5,才去调用的内部函数。
在这里插入图片描述
在这里插入图片描述

由结果我们可以看到,闭包能够保存外层函数变量的状态,说的通俗一点,就是当调用func(2,3),return 的内部函数已经记录保存了此时a和b的值,而在最后执行x()时,a和b的值不会被第二次的4和5淹没。
在这里插入图片描述
3、闭包的缺点
(1)作用域没有那么直观
(2)因为变量不会被垃圾回收,所以有一点给的内存占用问题

4、闭包的总结
(1)闭包优化了变量,原来需要类对象完成的工作,闭包也可以完成
(2)由于闭包引入了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
(3)闭包使代码变得简洁,便于代码阅读
(4)闭包是理解装饰器的基础

5、应用:计数器

在这里插入图片描述

这是在执行68行代码,第二次调用内部函数时,发现在经过第一次调用内部函数以后,与内部函数同级的变量 container 发生了变化,由 [0] 变成了 [1] 。

猜你喜欢

转载自blog.csdn.net/qq_44994799/article/details/109801551