python中闭包函数_Python的闭包问题(关于内嵌函数引用闭包函数的变量问题)
一、闭包:
记得:闭包的特性就是:内嵌函数会保存它引用的外围函数的变量值。
闭包概念:在一个内部函数中,对外部作用域的变量进行引用,(并且一般外部函数的返回值为内部函数),那么内部函数和被引用的变量等就被认为是闭包。
闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体,所以严格来说,闭包不是等同于函数。
闭包是种技术实现,不应该说外围函数是闭包还是内嵌函数是闭包。
用一句话说明白闭包函数,那就是:函数内在包含子函数,并最终return子函数。
而闭包函数的最大价值在于:我们可以在函数的外部(返回了内嵌函数),直接读取该函数的局部变量。
def f1():
n = 1
def f2():
n = n +1
return n
return f2
res = f1()
print(res) # 2
二、看下面的程序:
特别注意点:
1、“greeting”函数访问了非本地的变量”prefix”,根据对namespace的理解,这是完全可以的。
2、重点是:变量”prefix”并没有随着greeting_conf函数的退出而销毁,反而是生命周期得到了延长。
记录1:
在Python中,函数对象有一个__closure__属性;
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
(,)
Good Morning
greeting # print(mGreeting.__name__)
通过__closure__属性看到,它对应了一个tuple,tuple的内部包含了cell类型的对象。可以得到cell的值为”Good Morning”,也就是变量”prefix”的值。
从这里可以看到闭包的原理,当内嵌函数引用了包含它的函数(enclosing function)中的变量后,这些变量会被保存在内嵌函数的__closure__属性中,成为内嵌函数本身的一部分。
记录2:
在Python中创建一个闭包可以归结为以下三点:
函数内嵌函数;
内嵌函数需要引用上一级namespace中的变量;
外围函数必须返回内嵌函数;
通过这三点,就可以创建一个闭包,Python装饰器就是使用了闭包。
python中闭包函数_Python的闭包问题(关于内嵌函数引用闭包函数的变量问题)相关推荐
- python中的用法_Python中使用@的理解
Python函数中使用@ 稍提一下的基础 fun 和fun()的区别 以一段代码为例: def fun(): print('fun') return None a = fun() #fun函数并将返回 ...
- python中文件分类_Python中的类是否在不同的文件中?
在Python中,一个文件称为 module.一个模块可以由多个类或函数组成. 由于Python不仅仅是一种OO语言,所以没有规则说明,一个文件只能包含一个类. 一个文件(模块)应该包含属于一起的类/ ...
- python中比较重要的几个函数_Python 几个重要的内置函数 python中的内置函数和关键字需要背过吗...
python重要的几个内置函数用法 python内置函数什么用忘不掉的是回忆,继续的是生活,错过的,就当是路过吧.来来往往身边出现很多人,总有一个位置,一直没有变.看看温暖的阳光,偶尔还是会想一想. ...
- zip在python中的用法_Python中zip()函数用法实例教程
本文实例讲述了Python中zip()函数的定义及用法,相信对于Python初学者有一定的借鉴价值.详情如下: 一.定义: zip([iterable, ...])zip()是Python的一个内建函 ...
- python中的int()_python中的int函数如何使用?
Python中有很多转换方法,例如int函数.int函数可以将字符串或者数字变成整形,而且是没有小数点的正或负整数.当参数为数字时可以用于取整,当参数为字符串时可以用于进制转换.具体操作请看本文. 1 ...
- python中reversed用法_Python中reversed函数有哪些功能呢?
摘要: 下文讲述Python中reversed函数的功能简介说明,如下所示: reversed函数是Python的内置函数 reversed函数功能: 将一个序列进行反向排列 reversed函数语法 ...
- python中setattr用法_python中hasattr()、getattr()、setattr()函数的使用
引言: 在阅读源码时,有很多简写的形式,其中一个比较常用的就是getattr()用来调用一个类中的变量或者方法,相关联的hasattr().getattr().setattr()函数的使用也一并学习了 ...
- Python中的装饰器、迭代器、生成器、推导式、匿名函数和高阶函数
文章目录 装饰器 迭代器 生成器 推导式 匿名函数 高阶函数 装饰器 闭包 介绍装饰器前先了解一下闭包,在Python中,一切皆对象(Object),函数(Function)也不例外,也是一个普通的对 ...
- python中 什么意思_Python里面的这几个梗,你能回答出来吗
原标题:Python里面的这几个梗,你能回答出来吗 初学者学习Python的时候,会有一些梗非常不适应,这些是Python特有的地方,今天我罗列出一些,希望对初学者有帮助! 1.Python中多重循环 ...
- python中定义数据结构_Python中的数据结构—简介
python中定义数据结构 You have multiples algorithms, the steps of which require fetching the smallest value ...
最新文章
- CVPR2020:基于自适应采样的非局部神经网络鲁棒点云处理(PointASNL)
- ubuntu安装OpenCV详细教程(建议收藏)
- pfsense软路由防火墙(安装过程、L2tp配置)
- oracle删除建分区索引,Oracle分区表之创建维护分区表索引的详细步骤
- web开发环境_Web开发人员的开发环境
- mysql 运行 compile_install mysql by compile(通过编译安装mysql)
- php调用mysql中文变量_用php调用MySQL里的数据,为什么汉字都变成了问号?在线等...
- Java 发展简史:初生遇低谷,崛起于互联网
- android学习-1
- Spring Boot 的 GraphQL 框架DGS
- ExecuteScalar的使用
- 《Python程序设计实验指导书》81个实验项目选做参考
- 基因组测序分析linux,基因组数据的重测序分析
- 国产麒麟系统PXE安装-传统bios(legacy)引导
- 2019.5.输入正整数n,再输入n个数,计算并输出这n个数之和。要求:本题必须使用递归完成,整个程序不允许使用循环。例如3 2 3 4,输出7
- 理解围绕软件技术标准的上层动机和力量
- 在PyTorch中使用Seq2Seq构建的神经机器翻译模型
- C语言+CE修改植物大战僵尸阳光
- 12帧跑步动画分解图_flash动画片中人物跑步的运动规律和逐帧运动画面教程
- OpenWRT 网络配置WAN口和LAN口