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

【闭包】Python中的闭包

比喻:

     通俗地讲就是别人家有某个东西,你想拿到但是因为权限不够(不打死你才怪),但是你可以跟家里的孩子套近乎,通过他拿到!这个家就是局部作用域,外部无法访问内部变量,孩子是从家里返回对象,对家里的东西有访问权限,借助返回对象间接访问内部变量!

def outer():      #------别人家
    x = 10        #别人家里的东西
    def inner():   #内部函数------别人家的小孩
        print(x)   #外部函数的一个变量
    return inner   #------返回小孩
 


f = outer()        #到别人家 “套近乎”别人的小孩,套出(返回)小孩f
f()                #f小孩执行



# 调用inner()函数的方法

1、法一
outer()()   

2、法二
f = outer()
f()

闭包的概念

在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中,这些私有变量能够保持其持久性。—— 维基百科

用比较容易懂的人话说,就是当某个函数被当成对象返回时,夹带了外部变量,就形成了一个闭包。看例子。

https://baijiahao.baidu.com/s?id=1601023189180094497&wfr=spider&for=pc

何时使用闭包

其实闭包在Python中很常见,只不过你没特别注意这就是一个闭包。比如Python中的装饰器Decorator,假如你需要写一个带参数的装饰器,那么一般都会生成闭包。

我个人认为,闭包存在的意义就是它夹带了外部变量(私货),如果它不夹带私货,它和普通的函数就没有任何区别。同一个的函数夹带了不同的私货,就实现了不同的功能。其实你也可以这么理解,闭包和面向接口编程的概念很像,可以把闭包理解成轻量级的接口封装。

python 函数内部修改外部变量

如果内部修改外部变量需要nonlocal,global 

def f1(): 
    print("in f1..")
    num=111 
    def f2(): 
       nonlocal num 
       num=222 
       print(num) 
    f2() 
    print(num) 
  
 
f1()

原文:https://blog.csdn.net/liming066/article/details/82184083

相关文章:

  • 【线程池】C语言实现的简单的线程池
  • 【互斥锁和条件变量】何时互斥锁不够,还需要条件变量?
  • 【malloc和calloc】malloc和calloc函数区别
  • 【pthread_detach/pthread_join】pthread_detach()与pthread_join的区别?
  • 【时间复杂度】时间复杂度
  • 【Dll调试】DLL调试方法
  • 【机器学习】线性回归数学推导
  • 【VS消除警告】VS消除特定警告/安全函数警告C4996 strncpy unsafe……
  • CSDN 博客备份工具
  • 【FTP】linux FTP传文件到windows
  • 【VS】在VS中添加lib库的三种方法
  • 【合并lib】windows下多个lib合并的方法|查看lib是导入库还是静态库
  • 【python】anaconda 安装第三方包
  • 【IP/TCP】127.0.0.1和localhost和本机IP三者的区别
  • 【C/C++相互调用】C调用C++库和C++调用C库的方法
  • gf框架之分页模块(五) - 自定义分页
  • github指令
  • Java 多线程编程之:notify 和 wait 用法
  • javascript数组去重/查找/插入/删除
  • MobX
  • SQL 难点解决:记录的引用
  • 给Prometheus造假数据的方法
  • 给新手的新浪微博 SDK 集成教程【一】
  • 观察者模式实现非直接耦合
  • 力扣(LeetCode)56
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 十年未变!安全,谁之责?(下)
  • 使用Gradle第一次构建Java程序
  • 小程序开发之路(一)
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (1)(1.11) SiK Radio v2(一)
  • (1)STL算法之遍历容器
  • (C#)一个最简单的链表类
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (Python第六天)文件处理
  • (zt)最盛行的警世狂言(爆笑)
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (三) diretfbrc详解
  • (四) 虚拟摄像头vivi体验
  • (一)UDP基本编程步骤
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转载)Linux 多线程条件变量同步
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • *p++,*(p++),*++p,(*p)++区别?
  • ./configure,make,make install的作用
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET 依赖注入和配置系统
  • .NET面试题(二)
  • .py文件应该怎样打开?
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @synthesize和@dynamic分别有什么作用?