当前位置: 首页 > article >正文

[Python学习日记-39] 闭包是个什么东西?

[Python学习日记-39] 闭包是个什么东西?

简介

闭包现象

闭包意义与作用

简介

        在前面讲函数和作用域的时候应该提到过,当函数运行结束后会由 Python 解释器自带的垃圾回收机制回收函数内作用域已经废弃掉的变量,但是在 Python 当中还有一种现象非常黏黏糊糊,很容易让你搞不清不同作用域之间的界限划分,这就是我们接下来要说的闭包现象。

闭包现象

        关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数)。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。也就是说,内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量、参数以及其他内部函数,导致最后外部函数的这些局部变量、参数和函数声明本应该随着函数的结束而回收的,但由于内部函数的影响导致其保留了下来。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响。单纯用文字说明并不是特别直观,我们直接用代码来看一下,代码如下

def outer():
    name = "Jove"

    def inner():
        print("在 inner 里打印外层函数的变量",name)

    return inner    # 注意这里只是返回了 inner 的内存地址,并未执行

func = outer()    # 返回的是inner的内存地址
func()    # 相当于执行的是 inner()

代码输出如下:

         正常情况下在外部是没有办法执行 inner 的,但是 outer 返回了 inner 的内存地址,所以才可以找到在内存当中的 inner 函数,同时注意此时的 outer 已经执行完毕了,在正常情况下 outer 的内存地址应该已经都释放了才对,但是由于闭包的存在(inner 的内存地址作为返回值返回了,并且 inner 使用了 outer 内的变量),所以本该被释放变量都得以保留,这才让我们可以调用 inner,并且通过 inner 内部调用了上一层 outer 里的 name 变量。而这种黏黏糊糊让人分不清界线的就是闭包现象。

闭包意义与作用

        返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域。除此之外闭包还能实现数据隐藏和封装、记忆局部状态、实现函数工厂

  • 实现数据隐藏和封装:闭包将一些数据包裹在函数内部,外部无法直接访问,增加了程序的安全性和可维护性。只有通过特定的闭包函数才能操作这些数据。
  • 记忆局部状态:闭包能够记住外部函数中的局部变量的值,即使外部函数已经执行完毕。这使得闭包可以在不同的时间点保留状态信息,并在后续调用中继续使用。
  • 实现函数工厂:可以根据不同的输入生成不同的函数。通过在外部函数中接收参数,然后在内部函数中使用这些参数,就可以创建一系列功能相似但具有不同参数或状态的函数。

        闭包在 Python 中有着广泛的应用,理解闭包的意义对于写出更加简洁、高效和可维护的代码至关重要,闭包的重头戏还在后面,后面函数进阶学到的装饰器就会用到闭包,所以一定要提前弄清楚闭包的含义,免得到时候看得一脸懵逼。 


http://www.kler.cn/news/333580.html

相关文章:

  • 【2023工业3D异常检测文献】PointCore: 基于局部-全局特征的高效无监督点云异常检测器
  • javascript-obfuscator js混肴 (用户界面版)
  • 【ECMAScript 从入门到进阶教程】第四部分:项目实践(项目结构与管理,单元测试,最佳实践与开发规范,附录)
  • [SQL] SQL语句注意事项
  • Python——异常处理机制
  • AJAX 1——axios体验、认识URL、常用请求方法、HTTP协议、错误处理、form-serialize插件
  • 用Python实现运筹学——Day 12: 线性规划在物流优化中的应用
  • 【Qt】控件概述 (1)—— Widget属性
  • 胤娲科技:AI透视艺术大师——拉斐尔的笔触,500年后终被AI读懂
  • [C++][第三方库][Elasticsearch]详细讲解
  • 闭源与开源嵌入模型比较以及提升语义搜索效果的技术探讨
  • JAVA开源项目 旅游管理系统 计算机毕业设计
  • 「Qt Widget中文示例指南」如何实现一个平板电脑示例?(一)
  • 数据挖掘-padans初步使用
  • MySQL高阶2082-富有客户的数量
  • Oracle SQL语句没有过滤条件,究竟是否会走索引??
  • Shell文本处理(三)
  • 古典舞在线互动:SpringBoot平台设计与功能实现
  • 鸿蒙HarmonyOS NEXT 电商APP开发,打造你的专属购物商城
  • 【算法笔记】滑动窗口算法原理深度剖析