def wrapperfun(str_name):
def recoder(age):
print(str_name, age)
return recoder
fun = wrapperfun("Anna")
fun(37)
fun = wrapperfun("Gary")
fun(32)
print(fun.__closure__)
Anna 37
Gary 32
(<cell at 0x101b80e80: str object at 0x101a9b9b0>,)
闭合函数wrapperfun中实现了一个嵌入函数recoder,并将嵌入函数recoder返回。嵌入函数recoder中调用了外部变量str_name,这个str_name是由wrapperfun被调用时传入的参数。当wrapperfun被调用后,返回自身嵌入recorder的同时,又将自身的参数str_name与内嵌recoder绑定起来,赋值给fun。fun就等同一个str_name被初始化后的decoder函数。此时的fun可以理解为一个decoder的闭合函数,自由变量str_name存在与该闭合函数内
闭合函数比普通函数多一个属性closure,该属性会记录着自由变量的参数对象地址。当闭合函数被调用时,系统就会根据该地址找到自由变量,完成整体的函数调用