详解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脚本在Nginx和uwsgi上部署MoinMoin的教程
May 05 Python
python获取网页中所有图片并筛选指定分辨率的方法
Mar 31 Python
使用Python抓取豆瓣影评数据的方法
Oct 17 Python
使用selenium模拟登录解决滑块验证问题的实现
May 10 Python
pyqt实现.ui文件批量转换为对应.py文件脚本
Jun 19 Python
如何使用django的MTV开发模式返回一个网页
Jul 22 Python
python中对_init_的理解及实例解析
Oct 11 Python
Python内置数据类型list各方法的性能测试过程解析
Jan 07 Python
给ubuntu18安装python3.7的详细教程
Jun 08 Python
解决python对齐错误的方法
Jul 16 Python
用Python实现Newton插值法
Apr 17 Python
Python中requests做接口测试的方法
May 30 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/06/30 Javascript
解决表单中第一个非隐藏的元素获得焦点的一个方案
2009/10/26 Javascript
javaScript checkbox 全选/反选及批量删除
2010/04/28 Javascript
javascript预加载图片、css、js的方法示例介绍
2013/10/14 Javascript
ANGULARJS中用NG-BIND指令实现单向绑定的例子
2014/12/08 Javascript
jQuery中:text选择器用法实例
2015/01/03 Javascript
Angular用来控制元素的展示与否的原生指令介绍
2015/01/07 Javascript
在JavaScript中使用对数Math.log()方法的教程
2015/06/15 Javascript
JQuery给select添加/删除节点的实现代码
2016/04/26 Javascript
利用n工具轻松管理Node.js的版本
2017/04/21 Javascript
jQuery+CSS实现的table表格行列转置功能示例
2018/01/08 jQuery
boostrap模态框二次弹出清空原有内容的方法
2018/08/10 Javascript
微信小程序后台持续定位功能使用详解
2019/08/23 Javascript
JS插入排序简单理解与实现方法分析
2019/11/25 Javascript
[09:47]2018DOTA2亚洲邀请赛4.5SOLO赛 No[o]ne vs Sumail
2018/04/06 DOTA
Python多线程编程(二):启动线程的两种方法
2015/04/05 Python
python处理大数字的方法
2015/05/27 Python
Python内置模块logging用法实例分析
2018/02/12 Python
python中找出numpy array数组的最值及其索引方法
2018/04/17 Python
浅谈利用numpy对矩阵进行归一化处理的方法
2018/07/11 Python
python代理工具mitmproxy使用指南
2019/07/04 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
2020/01/15 Python
CSS3线性渐变简单实现以及该属性在浏览器中的不同
2012/12/12 HTML / CSS
html5本地存储_动力节点Java学院整理
2017/07/12 HTML / CSS
html5记忆翻牌游戏实现思路及代码
2013/07/25 HTML / CSS
html5本地存储之localstorage 、本地数据库、sessionStorage简单使用示例
2014/05/08 HTML / CSS
HTML5 FileReader对象的具体使用方法
2020/05/22 HTML / CSS
美国渔具店:FishUSA
2019/08/07 全球购物
幼儿教师自我鉴定
2013/11/02 职场文书
户籍证明书标准模板
2014/09/10 职场文书
婚前协议书范本
2014/10/27 职场文书
文案策划岗位职责
2015/02/11 职场文书
技术入股协议书
2016/03/22 职场文书
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android
java设计模式--七大原则详解
2021/07/21 Java/Android
Python干货实战之八音符酱小游戏全过程详解
2021/10/24 Python