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 配置文 ...
随机推荐
- centos6.5 yum安装redis
1.yum添加epel源 yum install epel-release 2.安装yum yum install redis 3.Redis 服务端配置——Could not connect to ...
- Java中线程池的实现原理
知识点总结 ---------------------------------------------------------------------------------------------- ...
- CentOS6.8 下RPM方式安装MySQL5.6
1. 检查MySQL及相关RPM包,是否安装,如果有安装,则移除(rpm –e 名称) yum remove mysql mysql-server mysql-libs(我用的上面的)或者 [root ...
- 星级评分原理 N次重写的分析
使用的是雪碧图,用的软件是CSS Sprite Tools 第一次实现与分析: <!DOCTYPE html> <html> <head> <meta cha ...
- 微信小程序 支付功能 服务器端(TP5.1)实现
首先下载微信支付SDK ,将整个目录的文件放在 /application/extend/WxPay 目录下 在使用SDK之前我们需要对 WxPay.Config.php 进行配置 <?php n ...
- pyqt5 -——介绍及和pycharm的环境搭建
pyqt5简介: yQt5的类存在与如下模块当中: ● QtCore ● QtGui ● QtWidgets ● QtMultimedia ● QtBluetooth ● QtNetwork ● Qt ...
- Kubelet bootstrap 流程
首先,什么是kubelet bootstrap?在安装 k8s worker node 时,基本上 worker 的初始状态仅仅是安装了 docker 和 kubelet,worker 需要一种机制跟 ...
- Nginx隐藏标识以及其版本号
1.隐藏版本号 curl Nginx服务器时,有这么一行Server: nginx,说明我用的是 Nginx 服务器,但并没有具体的版本号.由于某些 Nginx 漏洞只存在于特定的版本,隐藏版本号可以 ...
- vscode的环境变量code
vscode的安装路径 本质:vscode的安装路径/Applications/Visual Studio Code.app/Contents/Resources/app/bin 下面有code可执行 ...
- [Ting's笔记Day6]活用套件carrierwave gem:(1)在Rails实现图片上传功能
carrierwave是一款经典的图片上传套件,本篇的目标是先在本地端(development)的rails项目试成功gem. (预计中集的进度会练习怎么利用Amazone S3架设图片上传Host, ...