python中global和nonlocal

首先要明白作用域的概念:
Local:最内层,包含局部变量,比如一个函数/方法内部
E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量,也叫闭包函数外的函数Enclosing。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
G(Global):当前脚本的最外层,比如当前模块的全局变量。
B(Built-in): 包含了内建的变量/关键字等。,最后被搜索

请记住这句话:如果一个全局变量在函数内被重新定义过,再在函数内使用变量则默认为局部变量;如果在函数内没有被定义,直接使用会被视为全局变量。如果需要在函数内定义(修改)全局变量,则要先用global进行声明,同理对于嵌套函数,如果需要在嵌套的函数内定义(修改)非局部也非全局变量,则需要使用nonlocal进行声明。

个人理解:想要修改本作用域的变量,需要先引用本作用域外的变量,这里用global,nonlocal关键字,引用完之后再是修改本作用域的变量

  1. 一种特殊情况
total = 0 # 这是一个全局变量
# 可写函数说明
def sum( arg1, arg2 ):
    #返回2个参数的和."
    total = arg1 + arg2 # total在这里是局部变量.
    print ("函数内是局部变量 : ", total)
    return total
#调用sum函数
sum( 10, 20 )
print ("函数外是全局变量 : ", total)

==total = arg1 + arg2 # total在这里是局部变量.==这句里面的total虽然与全局变量total一样,但是这里的total是被重新定义了的,因为定义与赋初值一块的。但如果total未被定义,则无法修改值,会出现局部作用域引用错误(比如:total+=1,就会报错),除非将total修改为全局变量,通过函数参数调用,如下:

total = 0  # 这是一个全局变量
# 可写函数说明
def sum(total):
    # 返回2个参数的和."
    total+=1  # total在这里是局部变量.
    print("函数内是局部变量 : ", total)
    return total
# 调用sum函数
sum(total)
print("函数外是全局变量 : ", total)

1.如果需要在函数内定义(修改)全局变量,则要先用global进行声明

a=1
def ha():
    global a
    a=a+1
    print('ha:',a)
ha()
print(a) #打印全局变量


D:\python\python.exe F:/code/a.py
ha: 2
2

进程已结束,退出代码 0

2.nonlocal 适用于在局部函数 中 的局部函数, 把最内层的局部 变量设置成外层局部可用,但是还不是全局的,或者说修改嵌套函数中的变量为非局部非全部变量

a=1
def ha():
    # global a
    a=2
    print('ha:',a)
    def hb():
        nonlocal a
        a += 1
        print('hb', a)
    hb()
ha()
print(a) #打印全局变量


D:\python\python.exe F:/code/a.py
ha: 2
hb 3
1

进程已结束,退出代码 0


3.修改嵌套内层函数中的变量为全局变量

a=1
def ha():
    global a
    a+=1
    print('ha:',a)
    def hb():
        global a #这里不能是nonlocal a,因为encloing作用域的变量修改为了全局变量,那么这里的局部变量也只能修改为全局变量
        a += 1
        print('hb', a)
    hb()
ha()
print(a) #打印全局变量


D:\python\python.exe F:/code/a.py
ha: 2
hb 3
1

进程已结束,退出代码 0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值