python闭包与nonlocal简单注意点

先来看闭包一个简单的例子:

假如有一个式子: y = kx + b,我们要算这一条线上的很多点,甚至要算很多线上的很多点,当然要用函数,但是每次都传三个参数也太麻烦了,全局变量也可以实现,但是每次还是要修改,也很麻烦,也可以用缺省参数,如果使用的是默认的那也好说,如果不是默认值还是要传很多参,还有一个方法就是用实例对象,但是一个创建出来就要考虑到还有魔法属性什么的,占用空间太大,这时就可以用闭包来实现:

def line_6(k, b):
    def create_y(x):
        print(k * x + b)
    return create_y

line_6_1 = line_6(1, 2)    # 相当于创建了一个闭包,指向了它
line_6_1(0)    # 向闭包中传递参数,调用它
line_6_1(1)
line_6_1(2)

line_6_2 = line_6(11, 22)    # 另一个闭包,并且指向了它
print(line_6_2)
line_6_2(0)
line_6_2(1)
line_6_2(2)

这里有个注意点:return 后面返回的是引用,调用的话还是在外部调用。这样我们就可以更好的理解闭包:一个函数中嵌套着另一个函数的定义,真正使用的也是内部函数,往往内部函数又要用到外部变量。这样子内部函数和要使用的外部函数的变量共同组成的空间就构成了一个闭包。也就是说,闭包是简单的功能+数据,跟实例对象类似但是更简单,数据、内存等也更少。

如何修改闭包中的值:

x = 300
def test1():
    x = 200
    def test2():
        nonlocal x    #如果没有这句话,下一句中默认在本函数中先找,找到了但是却发现在后面,之前没有定义,则报错
        print("---1---x = %d" % x)
        x = 100
        print("---2---x = %d" % x)
    return test2

t1 = test1()
t1()

#结果:
#---1---x = 200
#---2---x = 100

这段代码中要注意的就是nonlocal关键字,声明非局部变量,使用这个关键字所要注意的点:

1.外部必须有这个量

2.在内部函数声明nonlocal变量之前不能出现同名变量

3.内部修改这个变量,在外部有这个变量的第一层函数中生效

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值