详解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生成日历实例解析
Aug 21 Python
Python Sleep休眠函数使用简单实例
Feb 02 Python
Python读取指定目录下指定后缀文件并保存为docx
Apr 23 Python
Python3实现抓取javascript动态生成的html网页功能示例
Aug 22 Python
Python编程实现从字典中提取子集的方法分析
Feb 09 Python
TensorFlow模型保存和提取的方法
Mar 08 Python
python 对象和json互相转换方法
Mar 22 Python
python 除法保留两位小数点的方法
Jul 16 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
Aug 19 Python
Python是什么 Python的用处
May 26 Python
pytorch使用horovod多gpu训练的实现
Sep 09 Python
python 从list中随机取值的方法
Nov 16 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
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
php 获取本机外网/公网IP的代码
2010/05/09 PHP
PHP 提取图片img标记中的任意属性的简单实例
2013/12/10 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
2015/04/08 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
PHP数组对象与Json转换操作实例分析
2019/10/22 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
2020/03/23 PHP
Prototype Array对象 学习
2009/07/19 Javascript
jquery插件如何使用 jQuery操作Cookie插件使用介绍
2012/12/15 Javascript
当前页禁止复制粘贴截屏代码小集
2013/07/24 Javascript
在jquery中combobox多选的不兼容问题总结
2013/12/24 Javascript
深入理解javascript原型链和继承
2014/09/23 Javascript
Angularjs基础知识及示例汇总
2015/01/22 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
jQuery自定义滚动条完整实例
2016/01/08 Javascript
jquery PrintArea 实现票据的套打功能(代码)
2017/03/17 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
详解微信小程序canvas圆角矩形的绘制的方法
2018/08/22 Javascript
重置Redux的状态数据的方法实现
2019/11/18 Javascript
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
Python smallseg分词用法实例分析
2015/05/28 Python
详解在Python的Django框架中创建模板库的方法
2015/07/20 Python
Python实现简单石头剪刀布游戏
2021/01/20 Python
Python中format()格式输出全解
2019/04/12 Python
linux中如何使用python3获取ip地址
2019/07/15 Python
Python在Matplotlib图中显示中文字体的操作方法
2019/07/29 Python
pytorch 中的重要模块化接口nn.Module的使用
2020/04/02 Python
法国一家多品牌成衣精品中/高档商店:Graduate Store
2019/08/28 全球购物
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
宿舍违规用电检讨书
2014/02/16 职场文书
与美同行演讲稿
2014/09/13 职场文书
2014年依法行政工作总结
2014/11/19 职场文书
opencv检测动态物体的实现
2021/07/21 Python
Golang gRPC HTTP协议转换示例
2022/06/16 Golang