闭包定义: 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。所以导致了,生成的四个函数所得值时相同的.
|