详解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执行shell获取硬件参数写入mysql的方法
Dec 29 Python
python判断图片宽度和高度后删除图片的方法
May 22 Python
python构建自定义回调函数详解
Jun 20 Python
Python单体模式的几种常见实现方法详解
Jul 28 Python
python爬取基于m3u8协议的ts文件并合并
Apr 26 Python
python opencv minAreaRect 生成最小外接矩形的方法
Jul 01 Python
Python3实现配置文件差异对比脚本
Nov 18 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
Jan 14 Python
Pycharm配置PyQt5环境的教程
Apr 02 Python
python mock测试的示例
Oct 19 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
Nov 29 Python
Python如何利用pandas读取csv数据并绘图
Jul 07 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
实用函数4
2007/11/08 PHP
PHP isset()与empty()的使用区别详解
2010/08/29 PHP
细谈php中SQL注入攻击与XSS攻击
2012/06/10 PHP
解析thinkphp中的导入文件标签
2013/06/20 PHP
php中的路径问题与set_include_path使用介绍
2014/02/11 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
Yii框架创建cronjob定时任务的方法分析
2017/05/23 PHP
PHPMailer ThinkPHP实现自动发送邮件功能
2018/06/10 PHP
Yii2.0实现的批量更新及批量插入功能示例
2019/01/29 PHP
defer属性导致引用JQuery的页面报“浏览器无法打开网站xxx,操作被中止”错误的解决方法
2010/04/27 Javascript
js的alert样式如何更改如背景颜色
2014/01/22 Javascript
Underscore源码分析
2015/12/30 Javascript
Web安全测试之XSS实例讲解
2016/08/15 Javascript
node.js路径处理方法以及绝对路径详解
2021/03/04 Javascript
angular和BootStrap3实现购物车功能
2017/01/25 Javascript
vue2导航根据路由传值,而改变导航内容的实例
2017/11/10 Javascript
浅析vue给不同环境配置不同打包命令
2018/08/17 Javascript
微信小程序实现单选选项卡切换效果
2020/06/19 Javascript
在Python的Django框架下使用django-tagging的教程
2015/05/30 Python
python在windows下创建隐藏窗口子进程的方法
2015/06/04 Python
python爬虫使用cookie登录详解
2017/12/27 Python
python操作列表的函数使用代码详解
2017/12/28 Python
使用Python实现毫秒级抢单功能
2019/06/06 Python
python构建指数平滑预测模型示例
2019/11/21 Python
python 实现批量替换文本中的某部分内容
2019/12/13 Python
python如何实现不用装饰器实现登陆器小程序
2019/12/14 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
2020/04/08 Python
python实现扑克牌交互式界面发牌程序
2020/04/22 Python
Python3.7下安装pyqt5的方法步骤(图文)
2020/05/12 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
HTML5混合开发二维码扫描以及调用本地摄像头
2017/12/27 HTML / CSS
大学生毕业求职自荐书范文
2014/02/04 职场文书
银行内勤岗位职责
2014/04/09 职场文书
职业道德模范事迹材料
2014/08/24 职场文书
股东授权委托书范本
2014/09/13 职场文书
民主生活会发言材料
2014/10/20 职场文书