通俗易懂解释python闭包,闭包python 菜鸟教程
什么是终结?封闭有什么用?为什么使用闭包?今天我们就带着这三个问题来一步步了解闭包。
闭包和函数紧密相连。在介绍闭包之前,有必要介绍一些背景知识,比如嵌套函数的概念,变量的作用域。
作用域
作用域是程序运行时变量可以被访问的范围。函数中定义的变量是局部变量,局部变量的作用域只能在函数内部,不能在函数外部引用。
模块最外层定义的变量是全局变量,在全局范围内可见,当然也可以在函数中读入全局变量。例如:
而局部变量不能在函数外部访问。例如:
嵌套函数
函数不仅可以在模块的最外层定义,也可以在另一个函数中定义。像这样的函数中定义的函数称为嵌套函数(嵌套函数),例如:
对于嵌套函数,它可以访问在其外部作用域中声明的非局部变量。例如,代码示例中的变量msg通常可以由嵌套函数printer访问。
那么有没有可能局部变量即使超出了函数本身的作用域也能被访问呢?答案是结束。
什么是闭包
作为第一个类对象,函数可以作为函数的返回值返回。现在让我们考虑下面的例子:
这段代码和前面的例子效果完全一样,同样输出“python的禅”。不同的是直接返回内部函数printer作为返回值。
通常,函数中的局部变量仅在函数执行期间可用。一旦print_msg()被执行,我们会认为msg变量将不再可用。但是,这里我们发现,print_msg执行后,调用另一个,也就是闭包的函数时,msg变量的值是正常输出的,这就使得局部变量在函数外被访问成为可能。
看完这个例子,我们来定义一下闭包。维基百科上的解释是:
在计算机科学中,闭包是词法闭包的缩写,指自由变量的函数。这个被引用的自由变量将与这个函数一起存在,即使它已经离开了创建它的环境。所以还有一种说法是闭包是由函数及其相关的引用环境组成的实体。
另一个是闭包,本质上是一个函数。它由两部分组成,打印机函数和变量msg。闭包使得这些变量的值总是存储在内存中。
闭包,顾名思义,就是一个封闭的包,自由变量被包裹在其中。就像在一个类中定义的属性值一样,自由变量的可见范围与包一起。只要你能访问这个包,你就能访问这个自由变量。
为什么要使用闭包
闭包避免使用全局变量。此外,闭包允许函数与它们操作的一些数据(环境)相关联。这与面向对象编程非常相似,在面向对象编程中,对象允许我们将一些数据(对象的属性)与一个或多个方法相关联。
一般来说,当一个对象中只有一个方法时,使用闭包是更好的选择。看一个例子:
这比使用类更优雅,装饰器也是基于闭包的应用场景。
所有函数都有一个__closure__属性。如果这个函数是一个闭包,它返回一个由cell对象组成的tuple对象。对象的cell_contents属性是闭包中的自由变量。
这解释了为什么局部变量在离开函数后还可以在函数外被访问,因为它存储在闭包的cell_contents中。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。