nonlocal、Global的总结

在Python中,当引用一个变量的时候,对这个变量的搜索是按找**本地作用域(Local)、嵌套作用域(Enclosing function locals)、全局作用域(Global)、内置作用域(builtins模块)**的顺序来进行的,即所谓的LEGB规则。

然而当在一个函数内部为一个变量赋值时,并不是按照上面所说LEGB规则来首先找到变量,之后为该变量赋值。在Python中,在函数中为一个变量赋值时,有下面这样一条规则:

“当在函数中给一个变量名赋值是(而不是在一个表达式中对其进行引用),Python总是创建或改变本地作用域的变量名,除非它已经在那个函数中被声明为全局变量. ”

global适用于 函数内部 修改全局变量的值—全局作用域不仅限在类中,不是类也可以用。但是不同类不可以用
nonlocal适用于 嵌套函数 中内部函数修改外部变量的值

使用global关键字修饰的变量之前可以并不存在,而使用nonlocal关键字修饰的变量在嵌套作用域中必须已经存在,否则会报错。

def f1():
    a = 250
    def f2():
        nonlocal a  # 告诉python,要使用和修改的是外部的a
        a = 520
    f2()
    print(a)
f1()   # 输出 520

global不能用于嵌套函数~~~~~~~~~~~~~~~~~~~~~

x = 1
def f1():
    global x  # 函数内部修改全局变量
    x = 2
f1()
print(x)  #输出 2

在这里插入图片描述
注意,上述+=和=的区别,+=不行,错误是未定义。

def f1():
    a = 250
    def f2():
        global a
        a = 520
    f2()
    print(a)# 输出 250

a = 600
f1()   
print(a) # 输出520  -----可以看出,改的是全局变量,而不是外层嵌套函数,对外层嵌套函数是没有用的,只针对main函数.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值