详解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实现人人网登录示例分享
Jan 19 Python
使用Mixin设计模式进行Python编程的方法讲解
Jun 21 Python
基于tensorflow加载部分层的方法
Jul 26 Python
django利用request id便于定位及给日志加上request_id
Aug 26 Python
python列表list保留顺序去重的实例
Dec 14 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
Aug 06 Python
Python简易计算器制作方法代码详解
Oct 31 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
Jan 14 Python
使用Pytorch来拟合函数方式
Jan 14 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
Feb 22 Python
Python中快速掌握Data Frame的常用操作
Mar 31 Python
Python中json.dumps()函数的使用解析
May 17 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 foreach 参数强制类型转换的问题
2010/12/10 PHP
ThinkPHP中的关联模型注意点
2014/06/16 PHP
php获取访问者浏览页面的浏览器类型
2017/01/23 PHP
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
IFrame跨域高度自适应实现代码
2012/08/16 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
IE网页js语法错误2行字符1、FF中正常的解决方法
2013/09/09 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
2016/01/28 Javascript
AngularJs基本特性解析(一)
2016/07/21 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
2016/12/08 Javascript
JavaScript中的编码和解码函数
2017/02/15 Javascript
JavaScript实现左侧菜单效果
2017/12/14 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
Vue自定义弹窗指令的实现代码
2018/08/13 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
使用jQuery如何写一个含验证码的登录界面
2019/05/13 jQuery
Vuex的API文档说明详解
2020/02/05 Javascript
jQuery cookie的公共方法封装和使用示例
2020/06/01 jQuery
[02:25]专访DOTA2负责人Erik 国际邀请赛暂不会离开西雅
2014/07/21 DOTA
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
Python with的用法
2014/08/22 Python
Python程序中设置HTTP代理
2016/11/06 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
Python txt文件加入字典并查询的方法
2019/01/15 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
2020/03/25 Python
Python基于paramunittest模块实现excl参数化
2020/04/26 Python
python与c语言的语法有哪些不一样的
2020/09/13 Python
利用python实现后端写网页(flask框架)
2021/02/28 Python
中科前程Java笔试题
2016/11/20 面试题
市场营销专业求职信
2014/06/17 职场文书
学生会工作感言
2015/08/07 职场文书
校园安全学习心得体会
2016/01/18 职场文书
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
golang interface判断为空nil的实现代码
2021/04/24 Golang
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS
vue实现书本翻页动画效果实例详解
2022/04/08 Vue.js