Python闭包

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在全局是不能访问的(属于局部变量),可以保证变量不会被其他不被允许的方法随意修改的安全性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值