详解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批量同步web服务器代码核心程序
Sep 01 Python
跟老齐学Python之不要红头文件(2)
Sep 28 Python
python制作最美应用的爬虫
Oct 28 Python
Python win32com 操作Exce的l简单方法(必看)
May 25 Python
python数据结构之链表详解
Sep 12 Python
详谈Python高阶函数与函数装饰器(推荐)
Sep 30 Python
Numpy掩码式数组详解
Apr 17 Python
python判断文件夹内是否存在指定后缀文件的实例
Jun 10 Python
python 日期排序的实例代码
Jul 11 Python
python命名空间(namespace)简单介绍
Aug 10 Python
Python小程序之在图片上加入数字的代码
Nov 26 Python
python疲劳驾驶困倦低头检测功能的实现
Apr 04 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简单实现发送带附件的邮件
2015/06/10 PHP
浅谈PHP中foreach/in_array的使用
2015/11/02 PHP
PHP中常见的密码处理方式和建议总结
2018/10/14 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
Laravel中如何轻松容易的输出完整的SQL语句
2020/07/26 PHP
javascript 跳转代码集合
2009/12/03 Javascript
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
2010/07/24 Javascript
jquery 学习之二 属性相关
2010/11/23 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
JavaScript检查子字符串是否在字符串中的方法
2016/02/03 Javascript
jQuery实现自动输入email、时间和域名的方法
2016/08/24 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
jQuery中Nicescroll滚动条插件的用法
2016/11/10 Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
2016/11/21 Javascript
bootstrap提示标签、提示框实现代码
2016/12/28 Javascript
node中koa中间件机制详解
2017/08/22 Javascript
在iFrame子页面里实现模态框的方法
2018/08/17 Javascript
angularjs模态框的使用代码实例
2019/12/20 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
[02:58]魔廷新尊——痛苦女王至宝语音台词节选
2020/06/14 DOTA
对于Python装饰器使用的一些建议
2015/06/03 Python
pycharm中使用anaconda部署python环境的方法步骤
2018/12/19 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
2020/09/29 Python
python Yaml、Json、Dict之间的转化
2020/10/19 Python
html5 标签
2009/07/16 HTML / CSS
印度最大的时尚购物网站:Myntra
2018/09/13 全球购物
技术总监个人的自我评价范文
2013/12/18 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
2015年加油站工作总结
2015/05/13 职场文书
2015年治庸问责工作总结
2015/07/27 职场文书
筑梦中国心得体会
2016/01/18 职场文书
Vue实现下拉加载更多
2021/05/09 Vue.js
Python使用Beautiful Soup(BS4)库解析HTML和XML
2022/06/05 Python
Java使用HttpClient实现文件下载
2022/08/14 Java/Android