详解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中的应用之translate和maketrans用法详解
Aug 27 Python
在Python中操作字符串之replace()方法的使用
May 19 Python
python使用fcntl模块实现程序加锁功能示例
Jun 23 Python
python利用正则表达式排除集合中字符的功能示例
Oct 10 Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 Python
PyCharm+PySpark远程调试的环境配置的方法
Nov 29 Python
Python2与Python3的区别实例总结
Apr 17 Python
Python 3.8 新功能全解
Jul 25 Python
Python Django框架防御CSRF攻击的方法分析
Oct 18 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
Mar 16 Python
matplotlib subplot绘制多个子图的方法示例
Jul 28 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
Dec 14 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排序之二维数组的按照字母排序实现代码
2011/08/13 PHP
PHP执行linux命令常用函数汇总
2016/02/02 PHP
PHP创建多级目录的两种方法
2016/10/28 PHP
php7安装yar扩展的方法详解
2017/08/03 PHP
PHP date()格式MySQL中插入datetime方法
2019/01/29 PHP
Laravel框架Auth用户认证操作实例分析
2019/09/29 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
asp 的 分词实现代码
2007/05/24 Javascript
实现超用户体验 table排序javascript实现代码
2009/06/22 Javascript
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
JavaScript入门之事件、cookie、定时等
2011/10/21 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
2014/11/03 Javascript
JQuery中层次选择器用法实例详解
2015/05/18 Javascript
jQuery实现的背景颜色渐变动画效果示例
2017/03/24 jQuery
ionic3 懒加载
2017/08/16 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
vue列表数据发生变化指令没有更新问题及解决方法
2020/01/16 Javascript
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
python基于queue和threading实现多线程下载实例
2014/10/08 Python
python itchat实现微信好友头像拼接图的示例代码
2017/08/14 Python
python删除本地夹里重复文件的方法
2020/11/19 Python
pandas.DataFrame选取/排除特定行的方法
2018/07/03 Python
pandas 转换成行列表进行读取与Nan处理的方法
2018/10/30 Python
用python解压分析jar包实例
2020/01/16 Python
python+Selenium自动化测试——输入,点击操作
2020/03/06 Python
TensorFlow2.1.0最新版本安装详细教程
2020/04/08 Python
Keras自定义IOU方式
2020/06/10 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
2020/12/15 Python
详解python3 GUI刷屏器(附源码)
2021/02/18 Python
Ryderwear美国官网:澳大利亚高端健身训练装备品牌
2018/04/24 全球购物
物业管理员岗位职责范文
2013/11/25 职场文书
爱岗敬业演讲稿范文
2014/01/14 职场文书
市场营销战略计划书
2014/05/06 职场文书
毕业论文答辩开场白和结束语
2015/05/27 职场文书
2019如何书写演讲稿?
2019/07/01 职场文书