1.闭包定义:
在一个函数内部,定义另一个函数(内部函数)。这个内部函数引用外部函数的变量,外部函数返回内部函数我们称之为闭包。
简而言之,闭包是一个可以读取外部函数内部变量的函数。
例如:
构成闭包的两个条件:
2闭包的目的
①可以阅读里面函数变量的
②总是将某些变量的值存储在内存中
1.读取函数内部的变量
一般情况下,函数外部我们无法访问函数内部的变量。但是,有时如果您希望能够从函数外部访问函数内部的变量,则可以使用闭包。
例如:
从上面的代码可以看出,print(a)会抛出异常NameError:name'a'isnotdefine。无法在f1函数之外访问其变量。
可以通过在函数f1中定义闭包函数来访问它
例如:
2总是将一些变量的值存储在内存中
执行结果:
从上面的输出结果可以看出,闭包在执行外层函数时,根据n1存储了变量n1的值1=1。
3闭包的缺点
1由于闭包会导致函数变量存放在内存中,从而增加内存消耗,所以闭包不能被滥用。导致程序性能问题,并可能导致内存泄漏
2闭包不能改变外部函数局部变量指向的内存地址
3闭包时,不要引用返回函数任何循环变量,或者稍后会改变的变量
4判断一个函数是否是一个闭包
要判断一个函数是否是一个闭包,你可以检查它的opening属性。如果该函数是一个闭包,则查看此属性将返回一个Cell对象数组。如果我们分别查看每个单元对象的cell_contents属性,返回的内容就是闭包引用的自由变量的值。
执行结果:
闭包的__closure__方法可以看出,闭包存储了两个外部函数变量,其中是cell的内存地址,存储在对象类型为int,这个int存放的内存地址是多少?
__closure__闭包方法可以查看每个cell对象的内容
执行结果:
cell_contents解释了局部变量在离开函数后仍然存在的原因可以在函数外部访问,因为变量存储在单元格的内容中。
上一篇:python 内存泄漏定位
下一篇:python内存泄露排查