Python基础之闭包

在一般情况下,在函数外部我们是不能访问到函数内部的变量的。但是, 有时想要在函数外部能够访问到函数内部的变量,那么就可以使用闭包。例如:上面的代码可以看出,print(a)会抛异常NameError: name 'a' is not defined。在函数f1的外面无法访问它的变量的。在函数f1里面定义一个闭包函数就可以访问到...
Python基础之闭包
一.闭包的定义:
在一个函数的内部,再定义一个函数(内部函数)。这个内部函数引用了外部函数的变量,并且外部函数返回这个内部函数, 我们把这个使用外部函数变量的内部函数称为 闭包 。
简而言之, 闭包就是能够读取外部函数内的变量的函数。
例如:
形成闭包的两个条件:
二.闭包的用途
① 可以读取函数内部的变量
② 将一些变量的值始终保存到内存中
1.读取函数内部的变量
在一般情况下,在函数外部我们是不能访问到函数内部的变量的。但是, 有时想要在函数外部能够访问到函数内部的变量,那么就可以使用闭包。
例如:
上面的代码可以看出,print(a)会抛异常NameError: name 'a' is not defined。在函数f1的外面无法访问它的变量的。
在函数f1里面定义一个闭包函数就可以访问到了
例如:
2.将一些变量的值始终保存到内存中
运行结果:
通过上面的输出结果可以看出闭包保存了外部函数内的变量n1的值1,每次执行闭包都是在n1 = 1 基础上进行计算的。
三.闭包的缺点
1. 由于闭包会使得函数中的变量都被保存在内存中,会增加 内存消耗 ,所以不能滥用闭包,否则会造成程序的性能问题,可能导致内存泄露
2. 闭包无法改变外部函数局部变量指向的内存地址
3. 返回闭包时,返回函数不要引用任何循环变量,或者后续会发生变化的变量
四.判断一个函数是否是闭包
判断一个函数是不是闭包,可以查看它的 closure 属性。如果该函数是闭包,查看该属性将会返回一个cell对象组成的tuple。如果我们分别对每个cell对象查看其cell_contents属性,返回的内容就是闭包引用的自由变量的值。
运行结果:
闭包的__closure__方法,可以展示出闭包储存了外部函数的两个变量,cell的内存地址是什么,在cell里面储存的对象类型是int,这个int储存的内存地址是什么。
闭包的__closure__方法,可以查看每个cell对象的内容
运行结果:
cell_contents解释了局部变量在脱离函数后仍然可以在函数之外被访问的原因,因为变量被存储在cell_contents中了。
2022-07-20
mengvlog 阅读 11 次 更新于 2025-07-19 08:16:08 我来答关注问题0
  • 在一个函数的内部,再定义一个函数(内部函数)。这个内部函数引用了外部函数的变量,并且外部函数返回这个内部函数, 我们把这个使用外部函数变量的内部函数称为 闭包 。简而言之, 闭包就是能够读取外部函数内的变量的函数。例如:形成闭包的两个条件:二.闭包的用途 ① 可以读取函数内部的变量 ...

  • 调用a(1)就是调用inner(1),而调用inner(1)会把1传给y,所以y等于1。outer(10) 将inner中的x初始化为10a(1) 执行inner(1),10+1=11,返回11。建议更换防止闭包print(a(1)) #在这给y赋的值。

  • 在上面的例子当中,outer_function 的返回值就是闭包,这个闭包包含函数和环境,函数是 inner_function,环境就是 x,从程序语义的层面来说返回值是一个闭包,但是如果直接从 Python 层面来看,返回值也是一个函数,现在我们打印两个闭包看一下结果:从上面的输出结果可以看到两个闭包(从 Python 层面来说...

  • 在这点上闭包可以被理解为一个只读的对象,你可以给他传递一个属性,但它只能提供给你一个执行的接口。因此在程序中我们经常需要这样的一个函数对象——闭包,来帮我们完成一个通用的功能,比如后面会提到的——装饰器。3. 使用闭包 第一种场景 ,在python中很重要也很常见的一个使用场景就是装饰器...

  •  翡希信息咨询 闭包基本概念

    在Python中,闭包可用于实现状态存储和回调函数。广泛应用:闭包在函数式编程中用于构建高阶函数,在并发编程中用于创建独立的计算任务,在事件处理中用于存储事件处理函数的状态等。通过闭包,编程语言提供了强大的工具来创建复杂且可复用的代码结构,从而提高代码的可读性和可维护性。

檬味博客在线解答立即免费咨询

Python相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部