python迟邦定

1.绑定

    将函数体和函数调用关联起来,就叫绑定html

2.迟绑定

    在程序运行以前(也就是编译和连接时)执行的绑定是早绑定,迟绑定(late binding)是发生在运行时。python

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)

状况一:上面这四种状况的输出以下:post

2 2 2spa

状况二:
2
2
2code

状况三:
2 2 2htm

状况四:
0
1
2blog

对于状况一和状况二,没什么好说的,上面已经说过了,缘由在于python的迟绑定。it

可是,为何会有状况三和状况四这种情形发生呢?

首先咱们应该知道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的状况。

相关文章
相关标签/搜索