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 ...
随机推荐
- Unix系统编程():分散输入和集中输出(Scatter-Gather IO):readv和writev
分散输入和集中输出(Scatter-Gather IO):readv和writev 请问这个v又代表什么? readv和writev系统调用分别实现了分散输入和集中输出的功能. #include< ...
- C++中变量做数组长度
在Java中,这是完全可以的,比如我们运行如下程序: package cn.darrenchan.storm; import java.util.Arrays; public class Test { ...
- WEB 项目中JAVA取得WEBROOT物理路径
http://wwwzhouhui.iteye.com/blog/504330 ———————————————————————————————————————————————————————————— ...
- Yarn概述
转自:http://liujiacai.net/blog/2014/09/07/yarn-intro/ Yarn是随着hadoop发展而催生的新框架,全称是Yet Another Resource N ...
- 浅析 Hadoop 中的数据倾斜
转自:http://my.oschina.net/leejun2005/blog/100922 最近几次被问到关于数据倾斜的问题,这里找了些资料也结合一些自己的理解. 在并行计算中我们总希望分配的每一 ...
- 29Spring_Autowriter的一些疑惑(很重要)
我用一个Autowriter去注解一个属性,而且我没有在Spring的配置文件中的bean.xml中注册bean(<bean id=""...);那么这个注解有用吗?答案是不 ...
- 股票指数kdj,sar,macd
http://blog.eastmoney.com/gulingqianketong2011/blog_120832611.html http://blog.sina.com.cn/s/blog_a3 ...
- PyQt的QString 和 QStringList
在Qt的C++实现中的QString 和 QStringList 在Python的实现中等效替换为 "str1" 和 ["str1","str2&qu ...
- PyQt的Layout的比例化分块。
一. QGridLayout: // 列比 第0列与第1列之比为 1:2 layout2p1 -> setColumnStretch(0, 1); layout2p1 -> setColu ...
- 学习:erlang正则
一.re:run/3. ①.re:run("321321","2132",[caseless]). {match,[{1,4}]} %% 返回值是 匹配 ...