Python:闭包函数,nonlocal使用

嵌套函数:什么是嵌套函数

使用外部函数中变量

def out():
    x = 5
    def inn():
        print("inn函数中 x = {}".format(y))
    print("out函数中 x = {}".format(x))
    inn()

out()

结果:
inn函数中 x = 5
out函数中 x = 5

内部函数是可以引用外部函数的变量【仅限于定义内部函数的外部函数】

 修改外部变量中函数

def out():
    x = 5
    def inn():
        x = 1
        x += 1
        print("inn函数中 x = {}".format(x))
    inn()
    print("out函数中 x = {}".format(x))

out()

结果:
inn函数中 x = 2
out函数中 x = 5

内部函数是可以重新定义外部函数的变量,【不能改变外部函数中的变量,只是局限于内部使用】

 

闭包:出现在嵌套函数中,指的是内层函数引用到了外层函数的自由变量

自由变量:未在本地作用域中定义的变量。例如定义在内存函数外的外层函数的作用域中的变量


def count():
    c = [0]
    def inc():
        c[0] +=1
        return c[0]
    return inc
foo = count()
print(foo())
c  =100        #定义的变量没有引用到,全局变量是不能影响局部变量的
print(foo())    #这个地方因为python垃圾回收机制的原因的,所以会出现2

结果
1
2

c = [ 0 ] ,定义的是一个可变类型的列表,因此不会出现:x +=1的问题

那如何解决x +=1 的问题尼

可以gloabl解决,但是这样用,就不是闭包了

x  = 100
def out():
    x = 5
    def inn():
        global  x
        x += 1
        return x
    return inn


foo = out()
print(foo())

结果:
101

 

nonlocal关键字

使用了nonlocal关键字,将变量标记为不在本地作用域定义,而在上级的某一级局部作用域中定义,但不 能是全局作用域中定义

def out():
    x = 5
    def inn():
        nonlocal x
        x += 1
        return x
    return inn

foo = out()
print(foo())

结果:
6

不能作用于,全局变量中【报错:SyntaxError: no binding for nonlocal 'y' found】

y= 1
def out():
    nonlocal y
    y +=1
    x = 5
    def inn():
        nonlocal x
        x += 1
        return x
    return inn

foo = out()
print(foo())

结果:
SyntaxError: no binding for nonlocal 'y' found

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值