详解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 获取et和excel的版本号
Apr 09 Python
python版本坑:md5例子(python2与python3中md5区别)
Jun 20 Python
PyQT实现多窗口切换
Apr 20 Python
python3中函数参数的四种简单用法
Jul 09 Python
如何基于pythonnet调用halcon脚本
Jan 20 Python
python生成并处理uuid的实现方式
Mar 03 Python
windows上彻底删除jupyter notebook的实现
Apr 13 Python
Flask模板引擎Jinja2使用实例
Apr 23 Python
通过Python pyecharts输出保存图片代码实例
Nov 25 Python
python实现b站直播自动发送弹幕功能
Feb 20 Python
Matlab使用Plot函数实现数据动态显示方法总结
Feb 25 Python
python数字图像处理之图像的批量处理
Jun 28 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
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/03/02 无线电
PHP.MVC的模板标签系统(五)
2006/09/05 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
2015/12/22 PHP
Swoole4.4协程抢占式调度器详解
2019/05/23 PHP
JQuery 文本框使用小结
2010/05/22 Javascript
utf-8编码引起js输出中文乱码的解决办法
2010/06/23 Javascript
js冒泡法和数组转换成字符串示例代码
2013/08/14 Javascript
js拖拽一些常见的思路方法整理
2014/03/19 Javascript
jquery实现动态画圆
2014/12/04 Javascript
JQuery中Bind()事件用法分析
2015/05/05 Javascript
JQuery实现鼠标移动图片显示描述层的方法
2015/06/25 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
微信小程序之ES6与事项助手的功能实现
2016/11/30 Javascript
Bootstrap CSS组件之导航条(navbar)
2016/12/17 Javascript
NodeJS实现视频转码的示例代码
2017/11/18 NodeJs
实例详解ztree在vue项目中使用并且带有搜索功能
2018/08/24 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
JS实现倒计时图文效果
2018/11/17 Javascript
微信小程序picker组件关于objectArray数据类型的绑定方法
2019/03/13 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
原生JavaScript实现留言板
2021/01/10 Javascript
react-native 实现购物车滑动删除效果的示例代码
2021/01/15 Javascript
Python中使用strip()方法删除字符串中空格的教程
2015/05/20 Python
简单介绍Python中的几种数据类型
2016/01/02 Python
用Pygal绘制直方图代码示例
2017/12/07 Python
Python中文件的写入读取以及附加文字方法
2019/01/23 Python
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
html5 Canvas画图教程(6)—canvas里画曲线之arcTo方法
2013/01/09 HTML / CSS
店长岗位职责
2013/11/21 职场文书
物业客服专员岗位职责
2013/11/30 职场文书
网吧七夕活动策划方案
2014/08/31 职场文书
原告代理词范文
2015/05/25 职场文书
行政处罚事先告知书
2015/07/01 职场文书
创业计划书详解
2019/07/19 职场文书
励志语录:你若不勇敢,谁替你坚强
2019/11/08 职场文书
浅谈CSS不规则边框的生成方案
2021/05/25 HTML / CSS