python闭包和延迟绑定

Posted 挖洞的土拨鼠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python闭包和延迟绑定相关的知识,希望对你有一定的参考价值。

一、什么是闭包:

1、函数内定义函数。

2、外函数的返回时内函数的引用。

3、内函数使用外函数的局部变量(至少一个)。

1 def outfunc():
2     for num in range(4):
3         def infunc():
4             return num*2
5     return infunc
1 #测试代码:
2 def outfunc():
3     for num in range(4):
4         def infunc():
5             return num*2
6     return infunc
7 
8 test = outfunc()
9 print test()

结果后面解释。

二、闭包的好处:

1、避免使用全局变量

2、可以提供部分数据的隐藏

3、可以提供更优雅的面向对象实现

三、闭包中的延迟绑定:

  延迟绑定看起来是一个现象但不是本质。举个例子当内函数引用外函数的一个局部变量,但是局部变量是循环的,那么最后内部引用的这个变量其实对于内函数来说是一个全局变量,所以每一次调用,其实内部使用的这个变量都是循环的最后一个值,而不是每次生成一个调用。其实不止循环,对变量修改也是一样的。所以很多人理解延迟绑定,最后一个才绑定。而本质上是不对的。

  来解释一下,内函数绑定的不是外函数的变量的值,而是地址空间,在外部函数返回以后发现返回的是内函数,这个自己的局部变量还在使用,不会清空这个地址区域而是保存这个地址区域,此时,这个地址空的值是最后一次修改这个变量之后的值,对于循环来说就是最后一个的值。

1 def outfunc():
2     temp = [lambda : id(num) for num in range(4) ]
3     return temp
4 
5 for item in outfunc():
6     print item()

测试结果

所以也就很好解释了一中的结果等于6

以上是关于python闭包和延迟绑定的主要内容,如果未能解决你的问题,请参考以下文章

闭包应用之延迟函数setTimeout

Python - 将变量范围绑定到闭包

angularJS使用ocLazyLoad实现js延迟加载

理解Python中的延迟绑定

快速片段切换视图绑定 null

Python文件操作与函数目录