闭包
闭包描述
在嵌套函数中引用了自由变量的函数.这个自由变量就是外层嵌套函数中的变量(非全局变量)
闭包必须满足三个条件
1. 必须是嵌套函数
2. 内层嵌套函数必须引用了外层嵌套函数的变量
2. 外层嵌套函数的返回值是内层嵌套函数.
作用
嵌套函数的内层函数可以使用外层函数的变量,即使外层函数返回了,或者被删除了.内层函数依然可以使用外层函数的那个变量.
一个简单的闭包的示例
# encoding:utf-8
__author__ = 'Fioman'
__date__ = '2018/11/21 10:49'
# 闭包,fn使用了变量y并且外层函数make_power的返回值是fn(内层嵌套函数)
# 这个闭包可以实现x的y次方
def make_power(y):
# 自由变量就是y,当函数make_power返回后,fn依旧可以使用y的值
def fn(x):
return x ** y
return fn
# 让其实现平方的功能
f2 = make_power(2)
# 求某个数的平法
print("5的平法是:{}".format(f2(5)))
# 求立方的功能
f3 = make_power(3)
# 求某个数的立方
print("5的立方是:{}".format(5))
def outer_func():
loc_list = []
def inner_func(name):
loc_list.append(len(loc_list) + 1)
print '%sloc_list =%s' %(name, loc_list)
return inner_func
clo_func_0 = outer_func()
clo_func_0('clo_func_0')
clo_func_0('clo_func_0')
clo_func_0('clo_func_0')
clo_func_1 = outer_func()
clo_func_1('clo_func_1')
clo_func_0('clo_func_0')
clo_func_1('clo_func_1')
结果
clo_func_0 loc_list = [1]
clo_func_0 loc_list = [1, 2]
clo_func_0 loc_list = [1, 2, 3]
clo_func_1 loc_list = [1]
clo_func_0 loc_list = [1, 2, 3, 4]
clo_func_1 loc_list = [1, 2]
从上面这个简单的例子应该对闭包有一个直观的理解了。运行的结果也说明了闭包函数中引用的父函数中local variable既不具有C++中的全局变量的性质也没有static变量的行为。
在python中我们称上面的这个loc_list为闭包函数inner_func的一个自由变量(free variable)。If a name is bound in a block, it is a local variable of that block. If a name is bound at the module level, it is a global variable. (The variables of the module code block are local and global.) If a variable is used in a code block but not defined there, it is a free variable.
在这个例子中我们至少可以对闭包中引用的自由变量有如下的认识:闭包中的引用的自由变量只和具体的闭包有关联,闭包的每个实例引用的自由变量互不干扰。
一个闭包实例对其自由变量的修改会被传递到下一次该闭包实例的调用。