详解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网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
Apr 25 Python
Python基于回溯法子集树模板解决找零问题示例
Sep 11 Python
python验证码识别的示例代码
Sep 21 Python
Python切片操作深入详解
Jul 27 Python
解决PyCharm同目录下导入模块会报错的问题
Oct 13 Python
PowerBI和Python关于数据分析的对比
Jul 11 Python
docker django无法访问redis容器的解决方法
Aug 21 Python
pytorch 图像预处理之减去均值,除以方差的实例
Jan 02 Python
关于tf.reverse_sequence()简述
Jan 20 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
Feb 28 Python
pytorch损失反向传播后梯度为none的问题
May 12 Python
利用Python多线程实现图片下载器
Mar 25 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
基于文本的搜索
2006/10/09 PHP
php+ajax制作无刷新留言板
2015/10/27 PHP
javascript中注册和移除事件的4种方式
2013/03/20 Javascript
异步动态加载js与css文件的js代码
2013/09/15 Javascript
JS辨别访问浏览器判断是android还是ios系统
2014/08/19 Javascript
JavaScript实现数字数组按照倒序排列的方法
2015/04/06 Javascript
js实现头像图片切割缩放及无刷新上传图片的方法
2015/07/17 Javascript
javascript读取文本节点方法小结
2016/12/15 Javascript
js手机号批量滚动抽奖实现代码
2020/04/17 Javascript
JS获取本周周一,周末及获取任意时间的周一周末功能示例
2017/02/09 Javascript
利用Node.js编写跨平台的spawn语句详解
2017/02/12 Javascript
正则验证小数点后面只能有两位数的方法
2017/02/28 Javascript
js实现手机发送验证码功能
2017/03/13 Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
javascript基本常用排序算法解析
2017/09/27 Javascript
JavaScript实现微信红包算法及问题解决方法
2018/04/26 Javascript
详解微信JS-SDK选择图片遇到的坑
2018/08/15 Javascript
JS加密插件CryptoJS实现的DES加密示例
2018/08/16 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
2018/11/05 Javascript
[08:54]《一刀刀一天》之DOTA全时刻18:十九支奔赴西雅图队伍全部出炉
2014/06/04 DOTA
[01:18:21]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
用Python编写web API的教程
2015/04/30 Python
深入解析Python中的urllib2模块
2015/11/13 Python
python使用xlrd与xlwt对excel的读写和格式设定
2017/01/21 Python
python3实现小球转动抽奖小游戏
2020/04/15 Python
django项目中新增app的2种实现方法
2020/04/01 Python
维多利亚的秘密官方旗舰店:VICTORIA’S SECRET
2018/04/02 全球购物
建筑学推荐信
2013/11/03 职场文书
毕业生个人求职信范例分享
2013/12/17 职场文书
大一军训感言
2014/01/09 职场文书
户外亲子活动策划方案
2014/02/07 职场文书
党员干部一句话承诺
2014/05/30 职场文书
教师党员个人整改措施材料
2014/09/16 职场文书
动漫APP软件排行榜前十名,半次元上榜,第一款由腾讯公司推出
2022/03/18 杂记
Python如何用re模块实现简易tokenizer
2022/05/02 Python
python 学习GCN图卷积神经网络
2022/05/11 Python