[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.mzph.cn/diannao/55677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【保姆级教程】UMLS工具——MetaMap安装及使用

专家词典 https://lhncbc.nlm.nih.gov/LSG/Projects/lexicon/current/web/index.html SPECIALIST 词典是一个大型的生物医学和通用英语句法词典,旨在提供 SPECIALIST 自然语言处理系统 (NLP) 所需的词汇信息,其中包括 MetaMap 和词汇工具等。它旨在成为…

【微服务】网关 - Gateway(下)(day8)

网关过滤工厂 在上一篇文章中,主要是对网关进行了一个总体的介绍,然后对网关中的断言进行了一个描述。在这篇文章中,主要是对网关中的最后一大核心——过滤进行介绍。 当客户端发送过来的请求经过断言之后,如果还想在请求前后添…

SQl注入文件上传及sqli-labs第七关less-7

Sql注入文件上传 1、sql知识基础 secure_file_priv 参数 secure_file_priv 为 NULL 时,表示限制mysqld不允许导入或导出。 secure_file_priv 为 /tmp 时,表示限制mysqld只能在/tmp目录中执行导入导出,其他目录不能导出导入。 secure_fil…

opencv学习:利用帧差法实现对视频移动物体的识别、帧差法的优缺点及完整代码实现

基本概念 帧差法是视频处理和计算机视觉领域中用于移动检测的一种简单而有效的方法。它主要依赖于连续视频帧之间的像素差异来识别场景中的移动对象。 帧差法: 定义:帧差法通过比较连续的视频帧之间的差异来检测移动对象。基本思想是移动对象会在连续的…

【Android 源码分析】Activity生命周期之onDestroy

忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

信息学奥赛使用的编程IDE:Dev-C++ 安装指南

信息学奥赛(NOI)作为全国性的编程竞赛,要求参赛学生具备扎实的编程能力,而熟练使用适合的编程工具则是学习与竞赛的基础。在众多编程环境中,Dev-C IDE 因其简洁、轻量、支持C编程等特点,成为许多参赛者的常…

Android阶段学习思维导图

前言 记录下自己做的一个对Android原生应用层的思维导图,方便个人记忆扩展;这里只露出二级标题。 后语 虽然有些内容只是初步了解,但还是记录了下来;算是对过去一段学习的告别。

Linux Cent7 已安装MySQL5.7.X,再安装MYSQL8.4.2

一、 下载安装 检查Linux系统的glibc版本rpm -qa | grep glibc结果:glibc-common-2.17-260.el7_6.6.x86_64 glibc-2.17-260.el7_6.6.x86_64 glibc-headers-2.17-260.el7_6.6.x86_64 glibc-devel-2.17-260.el7_6.6.x86_64访问MySQL官网,下载对应版本数据…

JavaSE——面向对象6.1:继承知识点补充(虚方法表等)

目录 一、子类到底能继承父类中的哪些内容? 二、继承内存图 三、继承中:成员变量和成员方法的访问特点 (一)成员变量的访问特点 (二)成员方法的访问特点 1.this与super访问成员方法的特点 2.方法重写 2.1方法重写的本质:子类覆盖了从…

shell脚本写代码

用简单的test语句来判断是否闰年 #! /bin/bash read -p "sd " yearif [ $((year%4)) -eq 0 -a $((year%100)) -ne 0 -o $((year%400)) -eq 0 ]thenecho "是润年"elseecho "不是闰年" fi判断一个数是否为偶数 #! /bin/bash read -p "…

【C语言】猜数字小游戏

😂个人主页: 起名字真南 🤣个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 随机数的生成1.1 rand1.2 srand1.3 time1.4 设置随机数范围 2 猜数字游戏实现 前言:我们学习完前面的循环以后可以写一个猜数字小游戏 1 随机数的生成 想要完成…

Java 中的 LinkedHashMap

让我们从一个简单的 Java 代码片段开始,演示如何在 Java 中创建和使用 LinkedHashMap。 import java.util.LinkedHashMap; public class LinkedHashMapCreation { public static void main(String[] args) { // Create a LinkedHashMap of S…

django的路由分发

前言: 在前面我们已经学习了基础的Django了,今天我们将继续学习,我们今天学习的是路由分发: 路由分发是Web框架中的一个核心概念,它指的是将不同的URL请求映射到对应的处理函数(视图)的过程。…

Ambari搭建Hadoop集群 — — 问题总结

Ambari搭建Hadoop集群 — — 问题总结 一、部署教程: 参考链接:基于Ambari搭建大数据分析平台-CSDN博客 二、问题总结: 1. VMwear Workstation 查看网关 2. 资源分配 参考: 硬盘:master(29 GB&#xff…

手机使用技巧:8 个 Android 锁屏移除工具 [解锁 Android]

有时候,您会被锁定在自己的 Android 设备之外,而且似乎不可能重新进入。 一个例子就是你买了一部二手手机,后来发现无法使用。另一种情况是你忘记了屏幕锁定密码和用于验证密码的 Google 帐户凭据。这种情况很少见,但确实会发生&…

15分钟学 Python 第35天 :Python 爬虫入门(一)

Day 35 : Python 爬虫简介 1.1 什么是爬虫? 网页爬虫(Web Crawler)是自动访问互联网并提取所需信息的程序。爬虫的主要功能是模拟用户通过浏览器访问网页的操作,从而实现对网页内容的批量访问与信息提取。它们广泛应用于数据收集…

Unity各个操作功能+基本游戏物体创建与编辑+Unity场景概念及文件导入导出

各个操作功能 部分功能 几种操作游戏物体的方式: Center:有游戏物体父子关系的时候,中心点位置 Global/Local:世界坐标系方向/自身坐标系方向 :调试/暂停/下一帧 快捷键 1.Alt鼠标左键:可以实现巡游角度查看场景 2.鼠标滚轮…

MySQL从0到1基础语法笔记(上)

博客主页:誓则盟约系列专栏:Java Web关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 目录 MySQL笔记: 一、注释: 二、SQL四大类&#xff…

在线测径仪都有哪些别称?

在线测径仪广泛运用于电线电缆、输送管、金属丝、PVC管、医疗器械、塑料、金属拉丝、橡胶、高线、圆钢、钢筋、螺纹钢、钢管、轧钢等生产行业,主要用于这些行业生产出的产品的直径、椭圆度(双轴及以上测头)等的检测。 测径仪为在线检测设备&a…

智能指针详解

目录 智能指针原理 RAII Unique_ptr Shared_ptr Shared_ptr缺点 定制删除器 在C库里提供的智能指针有跟多&#xff0c;如下图所示&#xff0c;使用时需要包含头文件<memory>。下面将详细介绍这些智能指针的底层原理和缺点&#xff0c;还有每个智能指针的应用场景。…