Python中 nonlocal 与 global 关键字解析
首先来说:
python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量
1.global 关键字
global关键字用来在函数或其他局部作用域中使用全局变量。
money = 100
def getmoney(money):
money -= 100 # money = money - 100
print(money)
#(输出)-50这里输出-50
#因为函数内部money传的值50 正常计算九尾-50
print(getmoney(50)) #(输出)None 这里是因为函数并没有返回值
#如在print(money)下一行价格return money
#则print(getmoney(50)) 输出为-50
print(money) #(输出)100
#函数内局部变量如果不声明全局变量,并且不修改全局变量,即如果不去定义
#getmoney()内部的money为全局变量,则全局变量(外部的money)不会被修改
所以下面进行使用global 关键字:
money = 100
def getmoney():
global money #在这里定义money为全局变量,即函数内部作用为全局
money -= 50
print(money) #(输出)50
return money #这里置于一个返回计算值money
print(getmoney()) #(输出)50
#因为有了return 返回的值,则输出,没有return则None
print(money) #(输出)50 #因为全局变量作用
2.nonlocal关键字
首先,要明确 nonlocal 关键字是定义在闭包里面的,用来在函数或其他作用域中使用外层(非全局)变量。
使用 nonlocal 时,就声明了该变量不只在嵌套函数def getmoney(里面
才有效, 而是在整个大函数def func()里面都有效
def func():
money = 100 #nonlocal定以后 调用
def getmoney():
nonlocal money #定义外层变量
money -= 100
print(money)
def savemoney():
nonlocal money #定义外层变量
money += 100
print(money)
return getmoney, savemoney
f = func()
print(f) #(输出)(<function func.<locals>.getmoney at 0x000001E646F058C8>,
<function func.<locals>.savemoney at 0x000001E646F05840>)
函数地址
f[0]() #(输出)0 #利用下标读取getmoney
f[1]() #(输出)100 #利用下标读取savemoney