首先要明白作用域的概念:
Local:最内层,包含局部变量,比如一个函数/方法内部
E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量,也叫闭包函数外的函数Enclosing。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
G(Global):当前脚本的最外层,比如当前模块的全局变量。
B(Built-in): 包含了内建的变量/关键字等。,最后被搜索
请记住这句话:如果一个全局变量在函数内被重新定义过,再在函数内使用变量则默认为局部变量;如果在函数内没有被定义,直接使用会被视为全局变量。如果需要在函数内定义(修改)全局变量,则要先用global进行声明,同理对于嵌套函数,如果需要在嵌套的函数内定义(修改)非局部也非全局变量,则需要使用nonlocal进行声明。
个人理解:想要修改本作用域的变量,需要先引用本作用域外的变量,这里用global,nonlocal关键字,引用完之后再是修改本作用域的变量
- 一种特殊情况
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