成都网站建设设计

将想法与焦点和您一起共享

Python语法之闭包-创新互联

闭包的概念

成都创新互联长期为上1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为伊犁企业提供专业的成都网站建设、网站设计,伊犁网站改版等技术服务。拥有10年丰富建站经验和众多成功案例,为您定制开发。

在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。

在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。运行时,一旦外部的 函数被执行,一个闭包就形成了,闭包中包含了内部函数的代码,以及所需外部函数中的变量的引用。

函数名称的引用传递

def func():

print("--- func is run ----")

func()

ret = func

print(id(ret))

print(id(func))

ret()

运行结果:

--- func is run ----

56145576

56145576

--- func is run ----

由上图可知,和变量名一样的,函数名只是函数代码空间的引用,当函数名赋值给一个对象的时候就是引用传递。

局部-全局变量

定义在方法内的变量是局部变量,不能在方法外做引用;定义在模块最外层的变量是全局变量,它是全局范围内可见的。

那么问题来了,当方法内部有嵌套方法时,嵌套方法能否使用父方法中定义的局部变量呢?答案是可以。

def outer_func():

data = 520

def inner_func():

return data

return inner_func()

print(outer_func())

运行结果:

520

此时调用 outer_func() 函数的返回值就是 520,所以说嵌套方法可以使用父方法中声明的局部变量。

闭包的写法

上面的概念还算比较容易理解,那么什么是闭包呢?我们来看下面一段代码:

def outer_func():

data = 520

def inner_func():

return data

return inner_func

print(outer_func())

result = outer_func()

print(result())

运行结果:

.inner_func at 0x02D8B6A8>

520

闭包的执行流程图

执行第 11 行代码:

先执行 print() 函数中的 outer_funcf() 函数,并将内层函数 inner_func() 函数的内存地址进行返回,最终 print() 函数将 return 返回的内层函数地址进行打印输出。

执行第 13 行代码: 郑州看妇科的医院 http://www.ytsgfk120.com/

先执行等号右侧的 outer_func () 函数,最终返回 inner_func() 函数的地址引用。等号左侧 result 变量进行接收内层函数地址。

执行第 15 行代码:

先执行 print() 函数中 result() 函数,因为 result 变量保存了内层函数 inner_func() 函数的地址,所以 result 变量后面加上括号就相当于执行 inner_func() 函数。执行内层函数并且将 data 值返回,最终使用 print() 函数将返回值打印输出。

修改外部函数中的变量

nonlocal 关键字用来在函数或其他作用域中使用外层的(非全局)变量,修饰变量后表示该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,nonlocal 位置会发生错误(最上层的函数使用 nonlocal 修饰变量必定会报错)。

data = 20

def outer_func():

data = 0

def inner_func():

nonlocal data

data = 666

print("--- inner_func ---:",data)

inner_func()

print("--- outer_func ---:",data)

outer_func()

print("--- 函数外 ---:",data)

运行结果:

--- inner_func ---: 666

--- outer_func ---: 666

--- 函数外 ---: 20

总结

函数名只是函数代码空间的引用,当函数名赋值给一个对象的时候就是引用传递

定义在方法内的变量是局部变量,不能在方法外做引用,但是可以被内层函数引用。

闭包就是一个嵌套定义的函数,在外层运行时才开始内层函数的定义,然后将内部函数的引用传递给函数外的对象

内部函数和使用的外部函数提供的变量构成的整体称为闭包。

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前名称:Python语法之闭包-创新互联
链接URL:http://chengdu.cdxwcx.cn/article/cecijo.html