-
闭包( 保存函数的状态信息,使函数的局部变量信息依然可以保存下来( 逆作用域链 )
一般情况下,函数外部不能访问函数内部的变量,但是如果在这个函数内部,再声明一个局部函数,通过这个局部函数就可以访问这个函数内部的变量,私有属性的访问,就要用到闭包
从变量的声明周期来看,闭包延长了变量的生命周期,本来在函数内部的局部变量,当函数执行完成就应该把函数中的局部变量全部销毁,但有了闭包,这些局部变量就不会被销毁,延长了变量生命周期的同时也造成了内存的泄漏
eg.1 一个简单的例子
def FunX(x):
def FunY(y):
return x * y
return FunY
result = FunX(5)
>>> result(8)
40
>>> FunX(5)(8)
40
eg.2 一个复杂的例子
def Fun_1():
list = []
for i in range(1, 4):
def Fun_2():
return i*i
list.append(Fun_2)
return list
l1, l2, l3 = Fun_1()
>>> (l1(), l2(), l3())
9 9 9
使用闭包时需要注意:返回函数不要引用任何循环变量或者后续会发生变化的变量
def Fun_1():
list = []
for i in range(1, 4):
def Fun_2(j):
def Fun_3():
return j*j
return Fun_3
list.append(Fun_2(i))
return list
l1, l2, l3 = Fun_1()
>>> (l1(), l2(), l3())
1 4 9