理解Python函数闭包

本文深入探讨了Python中的闭包概念,解释了闭包如何保留外部函数的变量绑定。通过实例展示了闭包在计算移动平均值时的工作原理,并指出了使用不可变类型时的陷阱,强调了`nonlocal`关键字的作用。最后,文章提及闭包在理解Python装饰器中的重要性。
摘要由CSDN通过智能技术生成

本文主要介绍什么是闭包,Ptyhon中使用闭包时容易出现的变量问题。

闭包

闭包指延伸了作用域的函数,其中包含函数定义体中引用、但是不在定义体中定义的非全局变量。函数是不是匿名的没有关系,关键是它能访问定义体之外定义的非全局变量。

举个栗子

def make_averager():
    series = []
    
    def averager(new_value):
        series.append(new_value)
        total = sum(series)
        return total/len(series)
    
    return averager

avg = make_averager()
avg(10) # 10.0
avg(13) # 11.5
avg(19) # 14.0

上面定义了一个嵌套函数,作用是计算移动平均值。
调用make_averager时,返回一个averager函数对象。每次调用averager时,会把一个新的参数值添加到列表中,然后计算列表的平均值。seriesmake_averager函数的局部变量,但是调用avg(10)时,make_averager()函数已经返回了,所以它的本地作用域也没有了。

averager()函数中,series变成了自由变量,就是没在本地作用域中绑定的变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值