详解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用模块pytz来转换时区
Aug 19 Python
Python黑帽编程 3.4 跨越VLAN详解
Sep 28 Python
Python+Django搭建自己的blog网站
Mar 13 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
Apr 23 Python
python3处理含有中文的url方法
May 10 Python
Python运维自动化之nginx配置文件对比操作示例
Aug 29 Python
如何更优雅地写python代码
Jul 02 Python
Python发送邮件的实例代码讲解
Oct 16 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
Apr 24 Python
Python调用shell cmd方法代码示例解析
Jun 18 Python
如何以Winsows Service方式运行JupyterLab
Aug 30 Python
python 如何做一个识别率百分百的OCR
May 29 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
怎么使 Mysql 数据同步
2006/10/09 PHP
深入array multisort排序原理的详解
2013/06/18 PHP
php实现12306余票查询、价格查询示例
2014/04/17 PHP
教你php如何实现验证码
2016/01/20 PHP
php mysql数据库操作类(实例讲解)
2017/08/06 PHP
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
2010/11/20 Javascript
jquery中使用ajax获取远程页面信息
2011/11/13 Javascript
jQuery 联动日历实现代码
2012/05/31 Javascript
javascript五图轮播切换实用版
2012/08/17 Javascript
更快的异步执行(setTimeout多浏览器)
2014/08/12 Javascript
JavaScript简单表格编辑功能实现方法
2015/04/16 Javascript
jquery实现图片随机排列的方法
2015/05/04 Javascript
Backbone中View之间传值的学习心得
2016/08/09 Javascript
jQuery EasyUI封装简化操作
2016/09/18 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
JS常用加密编码与算法实例总结
2016/12/22 Javascript
JavaScript实现无穷滚动加载数据
2017/05/06 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
2019/04/25 Javascript
python采集博客中上传的QQ截图文件
2014/07/18 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
python字典改变value值方法总结
2019/06/21 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
2020/03/13 Python
Python ATM功能实现代码实例
2020/03/19 Python
Python如何实现大型数组运算(使用NumPy)
2020/07/24 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
2021/01/26 Python
中外合拍动画首获奥斯卡提名,“上海出品”《飞奔去月球》能否拿下最终大奖?
2021/03/16 国漫
细说CSS3中的选择符
2008/10/17 HTML / CSS
英国在线自行车商店:Evans Cycles
2016/09/26 全球购物
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
英国第一家领先的在线处方眼镜零售商:Glasses Direct
2018/02/23 全球购物
优秀应届毕业生推荐信
2014/02/18 职场文书
人事部经理岗位职责
2014/03/07 职场文书
英文演讲稿开场白
2014/08/25 职场文书
2014院党委领导班子及其成员群众路线对照检查材料思想汇报
2014/10/04 职场文书
HTML基础-标签分类(闭合标签,空标签,块级元素,行内元素,行级块元素,可替换元素)
2021/03/31 HTML / CSS
redis不能访问本机真实ip地址的解决方案
2021/07/07 Redis