Python之闭包与延时绑定问题
闭包定义:
1、闭包是一个嵌套函数
2、闭包必须返回嵌套函数
3、嵌套函数必须引用一个外部的非全局的局部自由变量
# 面试题
def num():
return [lambda x:i*x for i in range(4)]
# num() -> [函数,函数,函数,函数]
print([ m(2) for m in num() ])
#output: [6,6,6,6]
这不是闭包:
def foo1():
print('fo1')
def foo2():
print('fo2')
foo2()
这才是闭包:
def foo1(n):
def foo2(m):
return n + m
return foo2
a = foo1(2)
print(a(3))
这也是闭包:
def foo1():
var = 'hello'
def foo2():
print(var)
return foo2
a = foo1()
a()
回到题首,这是一个闭包,为了便于理解,我们可以把代码改成:
def mul():
func_list = []
for i in range(4):
def lam(x):
return x*i
func_list.append(lam)
return func_list
print([m(2) for m in mul()])
怎么理解呢?简单来说,在python里,相对而言的局部变量绑定的是值,非局部变量绑定的是空间, 而不是值本身,所以,for
循环生成的i
,相对于函数lam
来说,是全局变量,所以绑定的是i
所在的内存地址,但i
最后变成了3,lam
绑定的是3。所以导致了,生成的四个函数所得值时相同的.