python nonlocal 的应用

nonlocal作用:
Python 3 引入了 nonlocal 声明。它的作用是把变量标记为自由变量, 即使在函数中为变量赋予新值了,也会变成自由变量。如果为 nonlocal 声明的变量赋予新 值,闭包中保存的绑定会更新。主要应用在闭包中,将不可变类型的数据变为自由自由变量,对于可变类型的数据,在闭包中就没有必要用到这个参数了,这也很好理解,有这样的区别,主要是函数作用域的问题所引起的,对于可变类型,只是一个引用(地址)所以没有作用域的问题。
自由变量:
这是一个技术术语,指未在本地 作用域中绑定的变量。这也很好理解,如字面意思,其变量是自由的,不会再函数的因作用域的问题变为局部变量。

例如:

def make_averager():     
	count = 0     
	total = 0 
 
    def averager(new_value):        
    	count += 1         
    	total += new_value         
    	return total / count 
 
    return averager

对于上面这个例子其实是有问题的,因为python的编译规则使得其中定义的变量(count ,total )变为局部变量,而闭包在执行的时候他会抛弃本地作用域的东西(因为在调用外部函数的时候,函数已经返回。)

解决在代码中加上nonlocal声明就可以了。

def make_averager():     
	count = 0     
	total = 0 
 
    def averager(new_value):        
    	nonlocal count, total 
    	count += 1         
    	total += new_value         
    	return total / count 
 
    return averager

结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值