详解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之字典,你还记得吗?
Sep 20 Python
在Python中利用Into包整洁地进行数据迁移的教程
Mar 30 Python
Python实现的Google IP 可用性检测脚本
Apr 23 Python
python 截取 取出一部分的字符串方法
Mar 01 Python
python画图的函数用法以及技巧
Jun 28 Python
Python编程快速上手——strip()函数的正则表达式实现方法分析
Feb 29 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
Apr 10 Python
解决python Jupyter不能导入外部包问题
Apr 15 Python
python中查看.db文件中表格的名字及表格中的字段操作
Jul 07 Python
pycharm中选中一个单词替换所有重复单词的实现方法
Nov 17 Python
python Matplotlib基础--如何添加文本和标注
Jan 26 Python
尝试使用Python爬取城市租房信息
Apr 12 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
《心理测量者3》剧场版动画预告
2020/03/02 日漫
smarty模板中拼接字符串的方法
2014/02/14 PHP
php自定义session示例分享
2014/04/22 PHP
为百度UE编辑器上传图片添加水印功能
2015/04/16 PHP
php筛选不存在的图片资源
2015/04/28 PHP
使用正则去除php代码中的注释方法
2016/11/03 PHP
php5.3后静态绑定用法详解
2016/11/11 PHP
PHP实现的获取文件mimes类型工具类示例
2018/04/08 PHP
PHP设计模式之委托模式定义与用法简单示例
2018/08/13 PHP
解决Laravel自定义类引入和命名空间的问题
2019/10/15 PHP
JSON 教程 json入门学习笔记
2020/09/22 Javascript
javascript 主动派发事件总结
2011/08/09 Javascript
JavaScript面向对象(极简主义法minimalist approach)
2012/07/17 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
angularjs自定义ng-model标签的属性
2016/01/21 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
2016/07/01 Javascript
JavaScript数组操作函数汇总
2016/08/05 Javascript
浅谈jQuery为哪般去掉了浏览器检测
2016/08/29 Javascript
浅谈js获取ModelAndView值的问题
2018/03/28 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
2018/07/18 Javascript
JS无限级导航菜单实现方法
2019/01/05 Javascript
深入浅析Vue 中 ref 的使用
2019/04/29 Javascript
Vue学习之axios的使用方法实例分析
2020/01/06 Javascript
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
Python3.5 Pandas模块之DataFrame用法实例分析
2019/04/23 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
Python3中的bytes和str类型详解
2019/05/02 Python
Django框架实现的分页demo示例
2019/05/25 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
Java程序员综合测试题
2014/04/25 面试题
大学生2014全国两会学习心得体会
2014/03/10 职场文书
大学生自我鉴定书
2014/03/24 职场文书
机关保密承诺书
2014/06/03 职场文书
民主评议党员自我评议范文2014
2014/09/26 职场文书
内乡县衙导游词
2015/02/05 职场文书
教师教育心得体会
2016/01/19 职场文书