详解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使用cPickle模块序列化实例
Sep 25 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
Feb 19 Python
Python多进程同步简单实现代码
Apr 27 Python
Python利用itchat对微信中好友数据实现简单分析的方法
Nov 21 Python
python读取Excel实例详解
Aug 17 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
Jun 19 Python
Python re 模块findall() 函数返回值展现方式解析
Aug 09 Python
python xlwt如何设置单元格的自定义背景颜色
Sep 03 Python
Python图像处理模块ndimage用法实例分析
Sep 05 Python
pytorch+lstm实现的pos示例
Jan 14 Python
python安装cx_Oracle和wxPython的方法
Sep 14 Python
Python的轻量级ORM框架peewee使用教程
Feb 05 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
探讨:如何通过stats命令分析Memcached的内部状态
2013/06/14 PHP
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
2016/12/27 PHP
js 新浪的一个图片播放图片轮换效果代码
2008/07/15 Javascript
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
IE6 fixed的完美解决方案
2011/03/31 Javascript
jQuery toggleClass应用实例(附效果图)
2014/04/06 Javascript
connect中间件session、cookie的使用方法分享
2014/06/17 Javascript
jQuery中$.click()无效问题分析
2015/01/29 Javascript
jquery制作多功能轮播图插件
2015/04/02 Javascript
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
2016/01/07 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
2016/06/14 Javascript
javascript如何创建对象
2016/08/29 Javascript
Bootstrap实现可折叠分组侧边导航菜单
2018/03/07 Javascript
js如何验证密码强度
2020/03/18 Javascript
微信小程序:报错(in promise) MiniProgramError
2020/10/30 Javascript
[04:37]DOTA2英雄梦之声Vol20发条
2014/06/20 DOTA
Python selenium实现微博自动登录的示例代码
2018/05/16 Python
python修改字典键(key)的方法
2019/08/05 Python
pytorch进行上采样的种类实例
2020/02/18 Python
解决jupyter notebook 出现In[*]的问题
2020/04/13 Python
HTML5 虚拟键盘出现挡住输入框的解决办法
2017/02/14 HTML / CSS
html5组织内容_动力节点Java学院整理
2017/07/10 HTML / CSS
HTML5页面直接调用百度地图API获取当前位置直接导航目的地的实现代码
2018/03/02 HTML / CSS
英国高级百货公司:Harvey Nichols
2017/01/29 全球购物
法人授权委托书格式
2014/04/08 职场文书
巾帼文明岗申报材料
2014/05/01 职场文书
励志演讲稿800字
2014/08/21 职场文书
学习党的群众路线实践活动思想汇报
2014/09/12 职场文书
运动会广播稿150字(9篇)
2014/09/20 职场文书
整改报告格式
2014/11/06 职场文书
2015年度团总支工作总结
2015/04/23 职场文书
ROS系统将python包编译为可执行文件的简单步骤
2021/07/25 Python
Android Studio实现简易进制转换计算器
2022/05/20 Java/Android