摘要:我们说触发了闭包的函数叫做闭包函数闭包最大的特点就是它可以被外层函数返回后赋值给一个变量,并且携带了外层函数内定义的变量例子如下变量为函数开辟的局部命名空间内定义的变量函数内引用了变量的内层函数名被当作返回值,此时闭包规则达成。
什么是闭包?
其实我们在使用函数过程中不经意间就会触发闭包,因为总会出于某种原因会在函数内引用或修改上一层函数的变量,这时就会触发闭包
那么什么是闭包?其实就是函数嵌套时触发的一种规则,当前函数引用到上一层函数的局部命名空间的变量并且函数本身被当成对象返回时就触发该规则。
我们说触发了闭包的函数叫做闭包函数
闭包最大的特点就是它可以被外层函数返回后赋值给一个变量,并且携带了外层函数内定义的变量
例子如下:
def func1(): a = 2 #变量a为函数func1()开辟的局部命名空间内定义的变量 def func2(x): return x**a #函数fun2()内引用了变量a print("func2的id:",id(func2)) return func2 #内层函数名被当作返回值,此时闭包规则达成。 res = func1() # 此时res等同于func2,我们可以看看他们的id完全相同 print("res的id: ",id(res)) print(res(3)) del func1 print("删除函数func1之后:",res(5)) print(res.__closure__) print(type(res.__closure__[0])) print(res.__closure__[0].cell_contents) #此时,如果函数func2()没有引用外部函数变量a,我们可以试着把return x**a这句改成return x,这时函数func2就没有触发闭包规则 #此时如果再次打印res.__closure__,你会发现输出值为None
从下面输出结果可以看出,即使删除了函数func1,理论上应该消失的变量a依然可以使用(理论上a对应的局部空间消失了,则a应消失),变量a之所以仍然可以被引用,是因为闭包规则的作用,外部函数的局部变量可以被内部函数引用,即使外部函数已经返回了。
其实函数本身也是对象,而对象又有很多属性,其中和闭包相关的就是 closure 属性。
closure 属性定义的是一个包含 cell 对象的元组,其中元组中的每一个 cell 对象用来保存作用域中变量的值。
func2的id: 139940709362136 res的id: 139940709362136 9 删除函数func1之后: 25 #我们来打印一下res的__closure__属性,可以看出它是由cell对象组成的元组 (,) | #打印类型结果就是元组 2 #打印cell中的值可以看出,这个cell对象中存储的变量值为2
触发闭包后,实现了引用上层局部命名空间变量的同时又不依赖于该局部空间,即使该变量所在的函数被删除了,闭包函数依然可以使用它,实际上闭包函数把它保存在了__closure__属性中。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/42575.html
摘要:在内置命名空间不能使用全局和局部的名字。可以形象地理解成内置命名空间具有最高级别,不需要定义就可以使用,全局命名空间次之,最低级是局部命名空间。 python中的命名空间分三种: 内置的命名空间,在启动解释器的时候自动加载进内存的各种名字所在的空间,比如print,input等不需要定义就可以使用的名字 全局命名空间,就是从上到下所有我们定义的变量名和函数名所在的空间,是在程序从上到下...
摘要:定义函数中的函数使用关键字定义,格式为函数名形参函数语句块函数名只能包含字符串下划线和数字且不能以数字开头。所以默认参数还是放在后面合适。 定义函数 python中的函数使用关键字 def 定义,格式为: def 函数名(形参): 函数语句块 函数名只能包含字符串、下划线和数字且不能以数字开头。函数的形参分为:位置参数、默认参数(自带默认值的参数)、动态参数return是关键字...
摘要:事实上语言当中有的内容,比如函数循环结构体宏等等内容,也都有,所以大家千万不要认为语言白学了哈因为之前已经完整更新过语言的博客有需要可以往前翻,所以这里直接介绍相对语言当中新增的内容,而本章引入的内容是的关键字命名空间缺省参数函数重载。 ...
阅读 1971·2023-04-25 15:24
阅读 1546·2019-08-30 12:55
阅读 1584·2019-08-29 15:27
阅读 427·2019-08-26 17:04
阅读 2368·2019-08-26 10:59
阅读 1767·2019-08-26 10:44
阅读 2134·2019-08-22 16:15
阅读 2545·2019-08-22 15:36