python闭包详解函数_详解python函数的闭包问题(内部函数与外部函数详述)

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 "", line 1, in

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

>>> type(f)

>>> f(10)

80

>>> FuncX(7)(8)

56

由于闭包本身是基于内部函数这一概念而来,所以不能在外部函数的外部作用域对内部函数进行调用

>>> FuncY(8)

Traceback (most recent call last):

File "", line 1, in

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 "", line 1, in

File "", line 6, in Func1

File "", 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函数的闭包问题详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现一个简单的web服务器

代码:http://www.oschina.net/code/snippet_991746_45911转载于:https://www.cnblogs.com/lit10050528/p/4282771.html

python format 冒号_python之格式化输出

字符串格式化有两种方式,%和format先介绍下%号的方法#%s的语法结构,叫做占位符,就是先占一个位置,然后我们用真实的要显示的数据替换占位符即可#最简单的用法就是下面的方式,其实%s还有其他的功能# s 我的名字是%s,我…

Scala 入门1(变量、分支循环、函数)

文章目录1. var 变量,val常量2. 分支、循环3. 函数、方法4. 闭包学自 https://www.runoob.com/scala/scala-tutorial.html 1. var 变量,val常量 scala 语句 用 ; 或者 \n 分句 object HelloWorld { // 类名跟文件名一致def main(args: Array[String])…

2018qs计算机科学专业,2018QS世界大学计算机科学专业排名.docx

2018QS世界大学计算机科学专业排名在2018世界大学计算机科学与信息系统排名中,牛津大学位列第一,哈佛大学和剑桥大学紧随其后。本排名中,共有2所中国大学进入Top50,北京大学位列第17位,清华大学列 20 位,跟…

http://www.cnblogs.com/langjt/p/4281477.html

http://www.cnblogs.com/langjt/p/4281477.html转载于:https://www.cnblogs.com/outlooking/p/4283320.html

nineoldandroid使用_nineoldandroid 详细使用并且实现drawerlayout侧滑动画

nineoldandroid.view.ViewHelpe是一个为了兼容3.0以下的一个动画开源库相关函数解读:(第一个参数都为动画对象,第二个为动画属性值的变化表达式)ViewHelper.setTranslationX(,);//x方向平移ViewHelper.setTranslationY(,);ViewHelper.setScaleX(,);x方向…

maven deploy plugin_Maven快速上手

作者:u_7deeb657158f出自:ITPUB博客原文:blog.itpub.net/69956102/viewspace-2726121/创建项目首先需要创建一个用于存储项目的文件夹,在控制台中输入以下命令:mvn archetype:generate -DgroupIdcom.mycompany.app -Da…

计算机应用基础形考作业3Excel部分,计算机应用基础形考3,Excel部分

“计算机应用基础”形考作业 3(Excel部分)可根据所学知识模块,在下列Excel、PowerPoint或Access中选做一个,我选了Excel (本次作业覆盖“模块 3 Excel 2010 电子表格系统”的内容,请在学完模块3后完成本次作业,要求第17周内完成。…

.net string format

转自:http://www.cnblogs.com/jobs2/p/3948049.html 转自:http://jingyan.baidu.com/article/48206aeaf8c52f216ad6b300.html 1、格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元&#xff0…

Scala 入门2(数组、List、Set、Map、元组、Option、Iterator)

文章目录1. 数组2. List3. Set4. Map5. 元组6. Option7. 迭代器学自 https://www.runoob.com/scala/scala-tutorial.html 1. 数组 使用 () 来取索引处的元素 // 数组var z1 : Array[String] new Array[String](3)var z2 new Array[String](3) // 两种方式定义z1(0) "…

python实现非对称加密算法_Python3非对称加密算法RSA实例详解

本文实例讲述了Python3非对称加密算法RSA。分享给大家供大家参考,具体如下:python3 可以使用 Crypto.PublicKey.RSA 和 rsa 生成公钥、私钥。其中 python3.6 Crypto 库的安装方式请参考前面一篇《Python3对称加密算法AES、DES3》rsa 加解密的库使用 pip3…

python画饼图_百度飞桨PaddlePaddle之[Python小白逆袭大神]7天训练营

第三次参加百度的7天训练营了这次参加的主题是【Python小白逆袭大神】,不过你别看是小白逆势。。。除非你一开始参加就逆袭完,不然你真的是python小白,这个课程还是有难难度的。说一下个训练营的特点版。这个营从python一些基础练习-->数据…

潍坊学院的计算机类怎么样,潍坊学院教育技术学专业怎么样?有知道的麻烦说下,谢谢!...

潍坊学院教育技术学专业怎么样?有知道的麻烦说下,谢谢!以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!潍坊学院教育技术学专业怎么样?有知道的…

elasticsearch配置文件详解

elasticsearch的config文件夹里面有两个配置文件:elasticsearch.yml和logging.yml,第一个是es的基本配置文件,第二个是日志配置文件,es也是使用log4j来记录日志的,所以logging.yml里的设置按普通log4j配置文件来设置就…

Scala 入门3(类、Trait、模式匹配、正则、异常、提取器、IO)

文章目录1. 类和对象2. Trait3. 模式匹配4. 正则5. 异常处理6. 提取器7. 文件 IO学自 https://www.runoob.com/scala/scala-tutorial.html 1. 类和对象 object myClass {import java.io._class Point(xc : Int, yc : Int){var x : Int xcvar y : Int ycdef move(dx:Int, dy…

The Power of Android Action Bars(转载)

转自:http://www.informit.com/articles/article.aspx?p1743642转载于:https://www.cnblogs.com/lance-ehf/p/4285239.html

计算机网络校园网简单设计与实现,简单校园网的设计与实现.docx

本科课程考查(论文)专用封面作业(论文)题目:所修课程名称:简单校园网的设计与实现 《计算机网络实践》修课程时间: 2012年 9月至 2012年 12月完成作业(论文)日期:2012年12月评阅成绩:评阅意见:评阅教师签名…

python面向对象继承

如果一个A类继承自另一个B类,就把这个A类称为B的子类,把B称为A的父类或者超类。继承可以使子类具有父类的各种属性和方法,而不再需要写相同的代码。在令子类继承父类的同时,可以重新定义某些属性和方法,使其获得与父类…

c++ class struct同名_C/C++面向对象编程之封装

点击“蓝字”关注我们吧前言:何为面向过程:面向过程,本质是“顺序,循环,分支” 面向过程开发,就像是总有人问你要后续的计划一样,下一步做什么,再下一步做什么,意外、事物…

LeetCode 1718. 构建字典序最大的可行序列(贪心+回溯)

文章目录1. 题目2. 解题1. 题目 给你一个整数 n ,请你找到满足下面条件的一个序列: 整数 1 在序列中只出现一次。2 到 n 之间每个整数都恰好出现两次。对于每个 2 到 n 之间的整数 i ,两个 i 之间出现的距离恰好为 i 。 序列里面两个数 a[…