Python闭包
先上代码
def accumator(initialNumber=0, eachTimeAddMoreNumber=0):
sum = initialNumber
def inner_accumator(toAddNumber):
nonlocal sum
sum += toAddNumber + eachTimeAddMoreNumber
print(sum)
return inner_accumator
if __name__ == '__main__':
test = accumator(5, 20)
print(test(0))
print(test(10))
print(test(10))
print(test(10))
print(test(10))
print(accumator(5, 20)(10))
print(accumator(5, 20)(10))
#这样子使用时因为函数没有保存到变量,所以运行状态是不会被保存的,等于调用了一次函数
'''
输出
25
55
85
115
145
35
35
'''
个人理解
首先闭包返回一个函数,可供外部随时使用,这个函数由于存到全局变量中,全局变量直到进程运行结束才会结束,所以会一直保存这个函数的运行状态(上面有对比),而这函数由两层组成,外函数包括需要被当作运行状态保存的变量和内函数,通过内函数对外函数中的变量进行处理,比如累加累减,做成装饰器使用。
在Python中,当你在函数里使用外部变量,无论是参数还是直接使用,使用方式皆如下:
在python中,数据有两种类型:mutable(可变) 和 immutable (不可变)
list ,dict是mutable的;
int , string , float ,tuple是immutable 的。
在函数参数的传递过程中:
对于immutable object ,函数参数传递是值
对于mutable object,函数参数传递是指针
当传入的是list等可变数据时,由于传递的是指针,访问时是通过指针访问与外部同一个数据存放位置,所以可以直接修改数据其内部内容并对外部产生影响,而传入int等不可变数据时,则只可读不能写,如果你不在函数中声明(传参等于声明并初始化)就往不可变数据写入数据,会报没有声明就使用的错。而如果声明了新的变量,则修改它对外部变量是没有任何影响的,若要有影响,则此时推荐将变量声明为非局部变量:nonlocal,这时会告诉变量搜索引擎我要读写的变量是外部的,搜索引擎自动去一层层找外部变量(即最后才是全局变量)
闭包的好处之一是例如上面闭包函数中外函数声明的sum在全局是不能访问的(属于局部变量),可以保证变量不会被其他不被允许的方法随意修改的安全性