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闭包和延迟绑定的更多相关文章
- Python函数——闭包延迟绑定
前言 请看下面代码 def multipliers(): return [lambda x : i*x for i in range(4)] print ([m(2) for m in multipl ...
- python 延迟绑定
def multipliers(n): funcs = [] for i in range(n): def f(x): return x * i funcs.append(f) return func ...
- Python 闭包
什么是闭包? 闭包(closure)是词法闭包(lexical closure)的简称.闭包不是新奇的概念,而是早在高级程序语言开始发展的年代就已产生. 对闭包的理解大致分为两类,将闭包视为函数或者是 ...
- Python闭包详解
Python闭包详解 1 快速预览 以下是一段简单的闭包代码示例: def foo(): m=3 n=5 def bar(): a=4 return m+n+a return bar >> ...
- 理解Python闭包概念
闭包并不只是一个python中的概念,在函数式编程语言中应用较为广泛.理解python中的闭包一方面是能够正确的使用闭包,另一方面可以好好体会和思考闭包的设计思想. 1.概念介绍 首先看一下维基上对闭 ...
- python闭包和装饰器(转)
一.python闭包 1.内嵌函数 >>> def func1(): ... print ('func1 running...') ... def func2(): ... prin ...
- Python闭包需要注意的问题
定义 python中的闭包从表现形式上定义为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure),也就是说内层函数引用了外层函数 ...
- PHP 面向对象编程和设计模式 (2/5) - 静态变量、属性和方法及延迟绑定
PHP高级程序设计 学习笔记 2014.06.10 Static(静态)关键字用来定义静态方法和属性,static 也可用于定义静态变量以及后期静态绑定. 1.静态变量 static variable ...
- Atitit 延迟绑定架构法attilax总结
Atitit 延迟绑定架构法attilax总结 配置文件的延迟绑定1 Api属性与方法的回调延迟绑定1 后期绑定和前期绑定2 延迟调用2 用 Java 语言延迟绑定2 什么是推迟绑定 C++3 配置文 ...
随机推荐
- python class的创建
def f(): class a(): a=5 def f2(): pass Disassembly of f: 14 0 LOAD_CONST 1 ('a') 3 LOAD_CONST 3 (()) ...
- mybatis的Selective接口和普通接口的区别
举例说明: updateByPrimaryKeySelective会对字段进行判断再更新(如果为Null就忽略更新),如果你只想更新某一字段,可以用这个方法. updateByPrimaryKey对你 ...
- BBS(第二天) Django之Admin 自动化管理数据页面 与创建一个用户注册的验证码
1.admin的概念 # Admin是Django自带的一个功能强大的自动化数据管理界面 # 被授权的用户可以直接在Admin中操作数据库 # Django提供了许多针对Admin的定制功能 2. 配 ...
- EF 6.x实现dynamic动态查询
利用SqlQuery实现动态查询 public static IEnumerable<dynamic> SqlQueryDynamic(this DbContext db, string ...
- js:捕获冒泡和事件委托
一.事件流(捕获,冒泡) 事件流:指从页面中接收事件的顺序,有冒泡流和捕获流. 当页面中发生某种事件(比如鼠标点击,鼠标滑过等)时,毫无疑问子元素和父元素都会接收到该事件,可具体顺序是怎样的呢?冒 ...
- linux下redis4.0.2集群部署(利用Ruby脚本命令)
一.原生命令方式和Ruby脚本方式区别 利用Ruby脚本部署和用原生命令部署,节点准备的步骤都是一样的,节点启动后的握手,以及主从.槽分配,利用Ruby脚本一步就能完成,利用原生命令需要一步一步地执行 ...
- cdnbest如何查看节点和站点的流量,负载和连接信息
1. 通过查看top信息,查看该区域下所有节点和有访问量的站点的负载情况 点节点列表==>top图标 2. 查看单台节点的负载和连接信息 点节点列表==>管理 点击下图中三个红框可以查看单 ...
- java集合: jdk1.8的hashMap原理简单理解
HashMap的数据结构 HashMap是数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,他的底层结构是一个数组,而数组的元素是一个单向链表.HashMap默认初始化的是一个长度为16位的数 ...
- 丑数(python)
题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. # ...
- 关于@autoreleasepool
苹果推荐使用场景: 如果你编写的程序不是基于 UI 框架的,比如说命令行工具: 如果你编写的循环中创建了大量的临时对象:(常用) 如果你创建了一个辅助线程. @interface ViewContro ...