详解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中输出ASCII大文字、艺术字、字符字小技巧
Apr 28 Python
Django中更新多个对象数据与删除对象的方法
Jul 17 Python
Python3安装Pymongo详细步骤
May 26 Python
Python的IDEL增加清屏功能实例
Jun 19 Python
Python实现动态添加属性和方法操作示例
Jul 25 Python
解决Pycharm界面的子窗口不见了的问题
Jan 17 Python
Python3字符串encode与decode的讲解
Apr 02 Python
OpenCV哈里斯(Harris)角点检测的实现
Jan 15 Python
Python网络爬虫信息提取mooc代码实例
Mar 06 Python
Python数据正态性检验实现过程
Apr 18 Python
5分钟快速掌握Python定时任务框架的实现
Jan 26 Python
python基础之错误和异常处理
Oct 24 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通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
php 定义404页面的实现代码
2012/11/19 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
laravel通过a标签从视图向控制器实现传值
2019/10/15 PHP
jquery插件制作简单示例说明
2012/02/03 Javascript
原生js制作简单的数字键盘
2015/04/24 Javascript
js实现头像图片切割缩放及无刷新上传图片的方法
2015/07/17 Javascript
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
javascript每日必学之基础入门
2016/02/16 Javascript
jQuery Easyui学习教程之实现datagrid在没有数据时显示相关提示内容
2016/07/09 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
2016/08/01 Javascript
js实现无缝循环滚动
2020/06/23 Javascript
Javascript 实现简单计算器实例代码
2016/10/23 Javascript
JavaScript中数组Array.sort()排序方法详解
2017/03/01 Javascript
详谈js对url进行编码和解码(三种方式的区别)
2017/08/16 Javascript
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
深入剖析Node.js cluster模块
2018/05/23 Javascript
Vue 样式绑定的实现方法
2019/01/15 Javascript
JavaScript隐式类型转换代码实例
2020/05/29 Javascript
[59:00]OG vs TNC 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
你应该知道的python列表去重方法
2017/01/17 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
2017/09/26 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
2018/05/16 Python
Python numpy实现二维数组和一维数组拼接的方法
2018/06/05 Python
PyCharm配置mongo插件的方法
2018/11/30 Python
Python中一般处理中文的几种方法
2019/03/06 Python
快速排序的四种python实现(推荐)
2019/04/03 Python
python的re模块使用方法详解
2019/07/26 Python
用python求一重积分和二重积分的例子
2019/12/06 Python
没编程基础可以学python吗
2020/06/17 Python
linux面试题参考答案(11)
2012/05/01 面试题
大唐面试试题(CPU,UNIX等等)
2012/01/11 面试题
医院辞职信范文
2014/01/17 职场文书
战略合作协议书范本
2014/04/18 职场文书
英文投诉信格式
2015/07/03 职场文书
教你使用Python获取QQ音乐某个歌手的歌单
2022/04/03 Python