闭包,又称闭包函数、闭包函数,写法类似函数嵌套。闭包的基本操作是从复杂的概念中提取出来的。在Python中,闭包就是你调用一个函数X,这个函数返回一个Y函数给你。返回的函数Y是闭包。在掌握任何技术之前,首先要看最基本的case代码:deffunc(parmas):#innerfunctiondefinner_func(p):print(f"函数外部参数{parmas},函数内部参数{p}")returninner_funcinner=func("outer")inner("inner")上面代码的说明如下,调用func("outer")时,会生成一个闭包inner_func函数,在里面调用外层函数func闭包函数的参数parmas,此时的parmas参数称为自由变量(概念名词,理解就好)。当函数func的声明循环结束时,变量parmas仍然存在,因为它被闭包函数inner_func调用,所以不会被回收。简单学习了闭包操作后,你会发现闭包操作在之前的博客中已经用到了,而博客描述的内容就是一个装饰器。再次注释上面的代码,帮助你理解闭包函数的实现。#定义外部(outer)函数deffunc(parmas):#定义内部(inner)函数definner_func(p):print(f"Externalfunctionparameter{parmas},internalfunctionparameter{p}")#mustReturntheinnerfunctionreturninner_func#调用outer函数并将其赋值给一个新的变量inner。这时候inner就相当于inner函数并且保留了自由变量paramsinner=func("outer")inner("inner")总结一下,实现一个闭包需要以下步骤:必须有一个inner函数;内层函数必须使用外层函数的变量,不使用外层函数的变量闭包是没有意义的;外层函数的返回值必须是内层函数。闭包作用域先看代码:defouter_func():my_list=[]definner_func(x):my_list.append(len(my_list)+1)print(f"{x}-my_list:{my_list}")returninner_functest1=outer_func()test1("i1")test1("i1")test1("i1")test1("i1")test2=outer_func()test2("i2")test2("i2")test2("i2")test2("i2")上面代码中自由变量my_list的作用域只和每次调用外层函数时产生的变量有关,闭包各个实例引用的变量互不干扰.闭包的作用在上面,大家是不是已经对闭包的作用有了初步的了解呢?接下来要强调的是,闭包操作会涉及范围相关的问题。最终目的是脱离函数本身的作用域,局部变量仍然可以访问。defouter_func():msg="DreamEraser"definner_func():print(msg)returninner_funcouter=outer_func()outer()如果你还记得滚雪球的第一遍,你就会知道局部变量只在函数的执行时可用,也就是说outer_func函数执行后,msg变量不可用,但是上面执行完outer_func后,再次调用outer时,msg变量也会输出。这就是闭包的功能,实现了闭包,函数外可以访问局部变量。可以扩展相应的理论,即在这种情况下,局部变量可以作为全局变量使用。最后说一句,解释一下闭包的作用:闭包保存了一些非全局变量,也就是保存了局部信息不被破坏。通过函数名.__closure__判断一个函数是否为闭包函数。defouter_func():msg="DreamEraser"definner_func():print(msg)returninner_funcouter=outer_func()outer()print(outer.__closure__)(
