Python中的闭包

在Python中,闭包是指了延伸作用域的函数,能够访问和引用非定义体中定义的非全局变量。这句话乍看上去难以理解,下面我用一个例子来说明。


计算累计值的和。


我们使用一个高阶函数,所谓高阶函数,即可以将其他函数当作参数传入,或当作结果返回的函数。


def total_sum():
    sums=[]

    def get_sum(value):
        sums.append(value)
        return sum(sums)

    return get_sum


然后在控制台测试:

>>> s=total_sum()
>>> s(10)
10
>>> s(20)
30
>>> s(9)
39
>>> s(3)
42


每调一次函数,就会产生之前累计的和。功能已经实现,现在来分析过程:

sums 是 total_sum 函数的局部变量,因为那个函数的定义体中初始化了 sums = []。可是,调用 sum(10)时,total_sum函数已经返回了,而它的本地作用域也就随之消失了。

然而,在get_sum 中,sums是一个自由变量,即未在本地作用域中绑定的变量。如下图所示:




利用python中__code__属性,我们可以查看到函数保存的局部变量和自由变量。如下:

>>> s.__code__.co_varnames
('value',)
>>> s.__code__.co_freevars
('sums',)


所以,闭包是一种函数,它延伸了自身的作用域,会保留定义函数时存在的自由变量的绑定,能引用外部非全局变量。但是,只有嵌套在其他函数中的函数才可能需要处理不在全局作用域中的外部变量。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值