详解python函数的闭包问题(内部函数与外部函数详述)


Posted in Python onMay 17, 2019

python函数的闭包问题(内嵌函数)

>>> def func1():
...   print ('func1 running...')
...   def func2():
...       print ('func2 running...')
...   func2()
... 
>>> func1()
func1 running...
func2 running...

内部函数func2作用域都在外部函数func1作用域之内
如果试图在外部函数的外部调用内部函数将会报错

>>> func2()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
NameError: name 'func2' is not defined

关于python的闭包问题

如果试图在一个内部函数里对外部作用域(不包括外部函数的外部作用域)的变量进行引用,内部函数就会被认为是闭包

>>> def FuncX(x):
...   def FuncY(y):
...       return x*y
...   return FuncY

对于FuncY函数来说,对在FuncX函数的整个作用域(FuncY函数的非全局作用域的外部作用)的变量x进行引用,自此就可以说FuncY函数就是所谓的闭包

>>> f = FuncX(8)
>>> f
<function FuncY at 0x7f3a436fc2a8>
>>> type(f)
<type 'function'>
>>> f(10)
80
>>> FuncX(7)(8)
56

由于闭包本身是基于内部函数这一概念而来,所以不能在外部函数的外部作用域对内部函数进行调用

>>> FuncY(8)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
NameError: name 'FuncY' is not defined

既然是基于内部函数这一概念而来,自然对于内部函数来说对引用外部函数作用域内的变量进行修改,将会启动解释器的屏蔽机制

>>> def Func1():
...   x = 233
...   def Func2():
...       x *=x
...       return x
...   return Func2()
... 
>>> Func1()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "<stdin>", line 6, in Func1
 File "<stdin>", line 4, in Func2
UnboundLocalError: local variable 'x' referenced before assignment

x*=x的左值此时是内部函数作用域里的变量,此时试图将没有定义的数据进行平方操作,因此报错

>>> def Func1():
...   x = 233
...   def Func2():
...       x = 321
...       return x
...   return Func2()
... 
>>> Func1()
321

内部函数创建x变量并且屏蔽外部函数作用域内的x变量

python3之前的解决办法

应用容器类型(list,tuple之类的)存放外部函数作用域的变量从而不会被屏蔽机制屏蔽掉,因为容器类型不是存放在栈里面

>>> def Func1():
...   x = [233]
...   def Func2():
...       x[0] *= x[0]
...       return x[0]
...   return Func2()
... 
>>> Func1()
54289

python3之后的解决办法:nonlocal关键字

>>> def Func1():
...   x = 233
...   def Func2():
...   nonlocal x
...       x *= x
...       return x
...   return Func2()
... 
>>> Func1()
54289

以上所述是小编给大家介绍的python函数的闭包问题详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python 异常处理总结
Oct 18 Python
Python编程实现的图片识别功能示例
Aug 03 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
Dec 14 Python
python通过Windows下远程控制Linux系统
Jun 20 Python
python tkinter实现屏保程序
Jul 30 Python
Python爬虫 批量爬取下载抖音视频代码实例
Aug 16 Python
Python collections模块使用方法详解
Aug 28 Python
Python 获取指定文件夹下的目录和文件的实现
Aug 30 Python
python统计指定目录内文件的代码行数
Sep 19 Python
python使用socket 先读取长度,在读取报文内容示例
Sep 26 Python
使用Python将Exception异常错误堆栈信息写入日志文件
Apr 08 Python
python 管理系统实现mysql交互的示例代码
Dec 06 Python
学习python分支结构
May 17 #Python
python pygame实现方向键控制小球
May 17 #Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
May 16 #Python
Python实现Linux监控的方法
May 16 #Python
计算机二级python学习教程(3) python语言基本数据类型
May 16 #Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
May 16 #Python
Python实现的文轩网爬虫完整示例
May 16 #Python
You might like
PHP 缓存实现代码及详细注释
2010/05/16 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
2012/02/19 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
2012/08/21 PHP
php不允许用户提交空表单(php空值判断)
2013/11/12 PHP
php上传图片客户端和服务器端实现方法
2015/03/30 PHP
php+js实现百度地图多点标注的方法
2016/11/30 PHP
js实现类似菜单风格的TAB选项卡效果代码
2015/08/28 Javascript
JavaScript是如何实现继承的(六种方式)
2016/03/31 Javascript
jQuery实现的图片轮播效果完整示例
2016/09/12 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
2017/01/01 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
JavaScript基础进阶之数组方法总结(推荐)
2017/09/04 Javascript
angularjs 获取默认选中的单选按钮的value方法
2018/02/28 Javascript
解析原来浏览器原生支持JS Base64编码解码
2019/08/12 Javascript
vue如何实现动态加载脚本
2020/02/05 Javascript
Python中使用logging模块打印log日志详解
2015/04/05 Python
Python中的pack和unpack的使用
2018/03/12 Python
python实现自动获取IP并发送到邮箱
2018/12/26 Python
简单了解Python生成器是什么
2019/07/02 Python
TensorFlow 多元函数的极值实例
2020/02/10 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
css3实现波纹特效、H5实现动态波浪效果
2018/01/31 HTML / CSS
Napapijri西班牙在线商店:夹克、外套、运动衫等
2020/11/05 全球购物
50道外企软件测试面试题
2014/08/18 面试题
给定一个时间点,希望得到其他时间点
2013/11/07 面试题
临床医学专业毕业生的自我评价
2013/10/17 职场文书
工程监理应届生求职信
2013/11/09 职场文书
外企求职信范文分享
2013/12/31 职场文书
秋季运动会广播稿
2014/02/22 职场文书
公司行政助理岗位职责
2015/04/11 职场文书
污水处理保证书
2015/05/09 职场文书
债务纠纷起诉书
2015/05/20 职场文书
无保留意见审计报告
2015/06/05 职场文书
北京爱情故事观后感
2015/06/12 职场文书
2016春季运动会开幕词
2016/03/04 职场文书
python turtle绘制多边形和跳跃和改变速度特效
2022/03/16 Python