Python中如何理解闭包

网友投稿 275 2022-09-05


Python中如何理解闭包

闭包,是函数式编程中的一个较难理解的概念,JavaScript、Python、Perl、Object-C等很多语言都支持闭包。

说白了, 闭包就是函数嵌套函数,在函数中定义并返回另一个函数。

例如:

def func1(): def func2(): pass return func2

通常情况下,我们的函数直接定义在模块中,模块中的变量称为全局变量,用户及任何函数都可以直接使用并修改。

如果把模块比作大厅的话,那么闭包就是包间。闭包中的变量,则只有内部函数能直接使用。

例如:

printer1 = '打印机1' # 全局变量,用户及所有函数可以使用和修改def room1(): # 闭包函数 printer2 = '打印机2' # 闭包函数中的变量称为 自由变量 def a(): pc1 = '电脑1' # 局部变量,只有当前函数使用 print('我可以使用全局变量', printer1) print('我可以使用自由变量', printer2) print('我可以使用自己的局部变量', pc1) return a # 不return 函数 a,则用户没办法使用这个函数 def b(): pc1 = '电脑2' # 局部变量,只有当前函数使用 print('我可以使用全局变量', printer1) print('我可以使用自己的局部变量', pc2)a = room1() # 调用闭包函数返回内部函数a() # 内部函数可以使用room1中的变量printer2b() # 调用普通函数b,b没办法使用room1中的变量

作用域链的原则是内部可以使用外部变量,外部不能使用内部变量。

使用闭包函数可以为函数开辟一个独立空间,其中的变量外部无法直接使用,只能通过函数a间接使用。因此闭包可以起到隐藏变量的作用,可以防止变量被修改和破坏。

为什么闭包函数room1中的变量printer2不是局部变量而称为“自由变量”呢?

我们知道,函数调用结束后即终止,其中的局部变量会被清理。如调用b函数结束后,其中的局部变量pc1就会清理回收(下次调用重新创建)。

而闭包函数room1调用后得到a函数,此时room1函数已经调用结束,但由于a函数还要使用变量printer2,因此printer2不会被清理,而是一直为a函数保留着。

因此,闭包会加大内存开销,甚至造成内存泄露。

然而隐藏和保护变量是很重要的,比如一个存钱和取钱的功能,两个都使用需要一个名为balance的余额变量,如果使用全局变量,示例如下:

使用全局变量的危险是,用户可以直接修改amount的值,不经过save存钱,便可任意draw取钱。

我们可以使用闭包来隐藏balance变量,例如:

为什么我们在Python中很少用到闭包?因为Python还支持类和对象呀,使用类可以轻松实现独立空间和变量私有问题。

在Python中,闭包常用作装饰器,在一个装饰器函数中定义一个新的函数来替代原函数。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:如何理解if __name__ == '__main__'
下一篇:Python Synchronous、Asynchronous(python入门教程(非常详细))
相关文章

 发表评论

暂时没有评论,来抢沙发吧~