详解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实现baidu hi自动登录的代码
Feb 10 Python
Python下载指定页面上图片的方法
May 12 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
Apr 17 Python
Linux下python与C++使用dlib实现人脸检测
Jun 29 Python
Django csrf 验证问题的实现
Oct 09 Python
Python发展简史 Python来历
May 14 Python
pycharm 批量修改变量名称的方法
Aug 01 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
python生成任意频率正弦波方式
Feb 25 Python
解决django FileFIELD的编码问题
Mar 30 Python
python实现飞船大战
Apr 24 Python
如何基于Python按行合并两个txt
Nov 03 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 session 错误
2009/05/21 PHP
解析argc argv在php中的应用
2013/06/24 PHP
php解析xml方法实例详解
2015/05/12 PHP
php+curl 发送图片处理代码分享
2015/07/09 PHP
PHP实现的json类实例
2015/07/28 PHP
PHP生成推广海报的方法分享
2018/04/22 PHP
在Windows上安装Node.js模块的方法
2011/09/25 Javascript
Js实现手机发送验证码时按钮延迟操作
2014/06/20 Javascript
一个简单的全屏图片上下打开显示网页效果示例
2014/07/08 Javascript
jQuery如何使用自动触发事件trigger
2015/11/29 Javascript
js实现九宫格拼图小游戏
2017/02/13 Javascript
JQuery中Ajax的操作完整例子
2017/03/07 Javascript
vuejs2.0子组件改变父组件的数据实例
2017/05/10 Javascript
JavaScript实现选中文字提示新浪微博分享效果
2017/06/15 Javascript
基于jQuery实现Ajax验证用户名是否可用实例
2018/03/25 jQuery
layui 地区三级联动 form select 渲染的实例
2019/09/27 Javascript
js实现轮播图效果 z-index实现轮播图
2020/01/17 Javascript
Element Cascader 级联选择器的使用示例
2020/07/27 Javascript
详解字典树Trie结构及其Python代码实现
2016/06/03 Python
Tensorflow简单验证码识别应用
2017/05/25 Python
Python enumerate索引迭代代码解析
2018/01/19 Python
Python检测网络延迟的代码
2018/05/15 Python
Python3转换html到pdf的不同解决方案
2019/03/11 Python
python对csv文件追加写入列的方法
2019/08/01 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
Python sorted对list和dict排序
2020/06/09 Python
HTML块级标签汇总(小篇)
2016/07/13 HTML / CSS
英国街头品牌:Bee Inspired Clothing
2018/02/12 全球购物
Lookfantastic阿联酋官网:英国知名美妆护肤购物网站
2020/05/26 全球购物
小学教师师德反思
2014/02/03 职场文书
人事任命书格式
2014/06/05 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
建筑工程材料员岗位职责
2015/04/11 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
vue3.0 数字翻牌组件的使用方法详解
2022/04/20 Vue.js