博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python闭包和延迟绑定
阅读量:4659 次
发布时间:2019-06-09

本文共 902 字,大约阅读时间需要 3 分钟。

一、什么是闭包:

1、函数内定义函数。

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

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

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

结果后面解释。

二、闭包的好处:

1、避免使用全局变量

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

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

三、闭包中的延迟绑定:

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

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

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

测试结果

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

转载于:https://www.cnblogs.com/KevinGeorge/p/8398981.html

你可能感兴趣的文章
ASP.NET网站和ASP.NET应用程序的区别
查看>>
Codeforces633G(SummerTrainingDay06-I dfs序+线段树+bitset)
查看>>
iOS判断手机某个App是否存在和常用scheme
查看>>
6 实现微信公众号 自动回复功能
查看>>
51Nod 1212无向图最小生成树
查看>>
hdu 4542 小明系列故事——未知剩余系
查看>>
Symbian UI 架构分类
查看>>
SVM入门(三)线性分类器Part 2
查看>>
mysql 执行 cannot found mac安装mysql的两种方法(含配置)
查看>>
BZOJ 1984: 月下“毛景树”( 树链剖分 )
查看>>
Properties类、序列化流与反序列化流
查看>>
Swift学习笔记一:与OC的区别
查看>>
七牛容器实操
查看>>
内存分配失败捕捉 set_new_handler
查看>>
2013年再见,我会永远记住这一年!
查看>>
Unity 游戏框架搭建 (十七) 静态扩展GameObject实现链式编程
查看>>
青蛙学Linux—Ansible中playbook的使用
查看>>
ASP.NET MVC3 URL友好化的重型武器[路由]
查看>>
tiny6410在I2c用户态中的程序设计eeprom
查看>>
canvas制作刮刮乐案例
查看>>