python迟邦定
1.绑定
将函数体和函数调用关联起来,就叫绑定
2.迟绑定
在程序运行之前(也就是编译和链接时)执行的绑定是早绑定,迟绑定(late binding)是发生在运行时。
3.实例说明
def outer():
return [lambda x: x*i for i in range(3)]
f1, f2, f3 = outer()
print f1(1)
print f2(1)
print f3(1) >>> 2
>>> 2
>>> 2
咋一看,上面输出的值貌似和自己想的并不一致,为什么会出现这个问题,这就是python的迟绑定导致的,闭包中的i值只有在调用匿名函数的时候才会去查询,这就导致了当你在调用f1,f2,f3的时候此时i的值已变成2,所以它们的输出结果都是一样的。
我们再来看看这个问题的变形。
#情况一
l = [lambda x: x*i for i in range(3)]
f1, f2, f3 = l
print f1(1),f2(1),f3(1) #情况二
l = [lambda x: x*i for i in range(3)]
for f in l:
print f(1)
#情况三
l = (lambda x: x*i for i in range(3))
f1, f2, f3 = l
print f1(1),f2(1),f3(1) #情况四
l = (lambda x: x*i for i in range(3))
for f in l:
print f(1)
情况一:上面这四种情况的输出如下:
2 2 2
情况二:
2
2
2
情况三:
2 2 2
情况四:
0
1
2
对于情况一和情况二,没什么好说的,上面已经说过了,原因在于python的迟绑定。
但是,为什么会有情况三和情况四这种情形发生呢?
首先我们应该知道python生成器的表达式,类似于列表推导,只不过是圆括号,
(lambda x: x*i for i in range(3))其实是一个生成器,我们先说一下为什么情况四和上面三种都不一样,生成器只有在调用next()时才会执行下去,所以在对这个生成器进行for迭代时,迭代一次,i的值变化一次,所以输出结果才会有0,1,2的变化。
为什么情况三没有这个变化呢?
l = (lambda x: x*i for i in range(3)),f1, f2, f3 = l,在对f1,f2,f3进行赋值时,已全部迭代完了,此时i的值为2,所以会出现输出值全是2的情况。
python迟邦定的更多相关文章
- [WPF系列]-数据邦定之DataTemplate 根据对象属性切换模板
引言 书接上回[WPF系列-数据邦定之DataTemplate],本篇介绍如何根据属性切换模板(DataTemplate) 切换模板的两种方式: 使用DataTemplateSelecto ...
- ServerSocket 默认邦定IP
转自:http://cuisuqiang.iteye.com/blog/2037769 开发中需要开启服务端的时候,本地测试都是直接写端口,实际环境也是需要指定要邦定的IP才可以. 因为对于服务器来说 ...
- ASP.NET中数据邦定效率问题的一点看法 - 转载(自由的天空)
在 做Asp.NET开发的时候经常用到DataList.Repeater等,用这些控件的时候经常用到数据邦定,很多程序员都是按照MS提供的方 法<%#DataBinder.Eval(Contai ...
- Python 数据处理----对定长数据的处理
场景: 有时候我们对大量数据进行处理,对性能要求很高,而且数据都是定长的,比如对移动信息登记表进行处理:名字 身份证信息 手机号码 这些都是定长的,今天小花来教大家如何对此类数据进行处理. 步骤一: ...
- 一行 Python 代码搞定一棵树
使用 Python 内建的 defaultdict 方法可以轻松定义一个树的数据结构. 简单的说树也可以是一个字典数据结构 Python 1 def tree(): retur ...
- 使用python来搞定redis的订阅功能
好久没写博客了. 最近公司开了新项目,我负责的内容之一是系统的后端.具体项目内容我就不介绍了,但是用到的技术有些还是很有趣的,值得记录一下.今天介绍的就是其中一个:利用redis的pubsub订阅 ...
- 一行python代码搞定文件分享
给同事分享文件,如你所知通过聊天工具,网盘或linux命令各种方法,还有一个也可以尝试下:使用一行python代码快速搭建一个http服务器在局域网内进行下载. python3使用: python3 ...
- 手把手教你使用Python轻松搞定发邮件
前言 现在生活节奏加快,人们之间交流方式也有了天差地别,为了更加便捷的交流沟通,电子邮件产生了,众所周知,电子邮件其实就是客户端和服务器端发送接受数据一样,他有一个发信和一个收信的功能,电子邮件的通信 ...
- 80行Python代码搞定全国区划代码
微信搜索:码农StayUp 主页地址:https://gozhuyinglong.github.io 源码分享:https://github.com/gozhuyinglong/blog-demos ...
随机推荐
- QListView和QListWidget的区别
QListView是基于Model,而QListWidget是基于Item.这是它们的本质区别. 往QListView中添加条目需借助QAbstractListModel: 如: MainWindow ...
- Android——RelativeLayout(相对布局)
一.相对于父容器 1.居中 2.同方向 <?xml version="1.0" encoding="utf-8"?> <RelativeLay ...
- 概率dp - UVA 11021 Tribles
Tribles Problem's Link: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33059 Mean: 有k个细 ...
- css实现圆角三角形例子(无图片)
css实现圆角三角形例子(无图片) 以前我们做圆角时都会要用到图片来实现,今天我给大家整理的这款css圆角效果是不需要图片的纯css实现的哦,下面我们一起来看看吧. 效果如下图所示 三角形所对方向&q ...
- 关于JQueryMobile中Slider的一点研究
滑动条 Slider 给input的设置一个新的HTML5属性为type="range",可以给页面添加滑动条组件,可以指定它的value值(当前值 ...
- 采样方法(Sampling Methods)
1.基本采样算法(Basic Sampling Algorithms) 1.1.标准概率分布(Standard distributions) 1.2.拒绝采样(Rejection sampling) ...
- 转载:Python十分钟入门
Python十分钟入门:http://python.jobbole.com/23425/
- Iframe 父子窗体互调javascript方法及相互获取控件
父窗体中的Iframe标签如下,子窗体为Default.aspx; <iframe id="left" name="left" src="Def ...
- Laravel5.1 搭建博客 --构建标签
博客的每篇文章都是需要有标签的,它与文章也是多对多的关系 这篇笔记也是记录了实现标签的步骤逻辑. 在我们之前的笔记中创建了Tag的控制器和路由了 所以这篇笔记不在重复 1 创建模型与迁移文件 迁移文件 ...
- Scilab 的画图函数(3)
我们在做数据画图或函数图像时常常须要使用对数坐标系.尤其是数据的范围跨越非常多个数量级时.通常的线性坐标系下无法表现出数据特征. Scilab 中Plot函数无法画出对数坐标.须要使用 plot2d ...