美文网首页Python小哥哥
详解Python闭包及其中隐藏的陷阱。

详解Python闭包及其中隐藏的陷阱。

作者: 我爱学python | 来源:发表于2019-03-22 16:14 被阅读0次

什么是闭包?

其实我们在使用函数过程中不经意间就会触发闭包,因为总会出于某种原因会在一个函数内部再定义一个函数,而当内层函数引用了外层函数命名空间内的变量(或者说对象),这时就会触发闭包。

那么什么是闭包?闭包就是对内层函数和其内部引用的上层局部命名空间变量的一种封装。

我们说触发了闭包规则的函数叫做闭包函数

闭包的应用方法:通过外层函数把闭包函数对象(python一切皆对象,函数也是对象)赋值给全局变量,然后通过调用全局变量来调用闭包。

闭包特点:闭包函数会把其定义时引用的外层函数的变量名保存起来,并且这些变量名将不再依存于外层函数,也就是说即使外层函数被删除了这些变量名依然存在。

划重点:上面这段话其实隐藏着一个“坑”,你要记住,闭包保存的仅仅是变量名,并没有立刻保存该变量指向的值,因为有的时候引用的变量值是在变化的,在闭包被调用之前,它引用的不是变量指向的具体值,只有在闭包被调用的时候,它才会去查找这些变量的值!

外层函数将闭包函数对象赋值给全局变量的操作可以通过return直接返回执行,当然也可以不用return,通过其他方法。

首先看一个使用return返回赋值的例子:

从下面输出结果可以看出,即使删除了函数func1,理论上应该消失的变量a依然可以使用(理论上a对应的局部空间消失了,则a应消失),变量a之所以仍然可以被引用,是因为闭包规则的作用,外部函数的局部变量可以被内部函数引用,即使外部函数已经返回了。

其实函数本身也是对象,而对象又有很多属性,其中和闭包相关的就是 、__closure__ 属性。

__closure__ 属性定义的是一个包含 cell 对象的元组,其中元组中的每一个 cell 对象用来保存作用域中变量的值。

触发闭包后,实现了引用上层局部命名空间变量的同时又不依赖于该局部空间,即使该变量所在的函数被删除了,闭包函数依然可以使用它,实际上闭包函数把它保存在了__closure__属性中。

然后我们来看看不用return的例子:

相关文章

  • 详解Python闭包及其中隐藏的陷阱。

    什么是闭包? 其实我们在使用函数过程中不经意间就会触发闭包,因为总会出于某种原因会在一个函数内部再定义一个函数,而...

  • Python 闭包使用注意点

    1 Python 闭包 今天,聊下 python 的闭包。在函数编程中经常用到闭包。 闭包是什么,它是怎么产生的及...

  • python函数之闭包

    目录 python函数之闭包什么是闭包python中的namespace闭包的条件闭包的优点 python函数之闭...

  • python闭包详解

    (一)了解python装饰器之前我们可以先了解什么闭包 闭包概念:在一个内部函数中,对外部作用域的变量进行引用,(...

  • python闭包学习

    参考文章 python闭包python闭包一步一步教你认识Python闭包深入浅出python闭包

  • js闭包问题

    javascript 闭包的概念,闭包的作用,闭包经典面试题详解(配图解) 函数作用域(闭包前置知识) 要彻底弄懂...

  • 闭包

    一、闭包技术详解 1.1 什么是闭包? 闭包实际上是一种函数,所以闭包技术也是函数技术的一种;闭包能做的事情函数几...

  • iOS开发之Swift篇(7)—— 闭包

    目录 版本 闭包的定义及使用 尾随闭包 逃逸闭包 版本 Xcode 11.0Swift 5.1 闭包的定义及使用 ...

  • useEffect的闭包陷阱及useInterval

    首先先看一段代码: 结果是:页面上count一直显示1;解析:useEffect的第二个参数为空数组,所以只会在组...

  • Python装饰器-专题笔记

    学会装饰器,Python更进阶 函数作用域到闭包到装饰器讲解,及闭包和装饰器的运用。 [√] 慕课网Meshare...

网友评论

    本文标题:详解Python闭包及其中隐藏的陷阱。

    本文链接:https://www.haomeiwen.com/subject/lrdrvqtx.html