python之golbal/nonlocal
一、关键字
golbal nonlocal
在局部修改全局的变量为什么会报错
count = 0
def func():
count += 1
func()
# UnboundLocalError: local variable 'count' referenced before assignment
# 解释器认为:如果你在局部作用域对一个变量进行修改了,你在局部作用域已经定义好这个变量了。
解释器认为: 如果你在局部作用域对一个变量进行修改,name你在局部作用域已经定义好这个变量了。
1. global (***)
用途
- 可以在局部作用域申明一个全局变量
例题
def func():
global name # 用法
name = 'alex'
print(locals())
func()
# 总结
# 申明一个变量的方法:global name
- 可以在局部修改一个全局变量
例题
count = 0
def func():
global count
count += 1
print(count)
func()
print(count)
# 输出结果
0
1
总结:
# 程序从上往下执行,先定义一个局部变量count = 0,然后往下执行,到print(count),这时候count指向的还是0,到func()也就是变量名加括号,开始执行定义函数,进入函数内部,声明count为全局变量,然后对count进行修改+1,跳出函数执行print(count),这个时候count已经+1操作,结果是1
2. nonlocal (了解)
用途
- nonlocal不能操作全局变量
- nonlocal 可以对父级作用域的变量进行修改,并且在当前作用域创建
例题
def func():
count = 0
def inner():
nonlocal count
count += 1
print(count)
print(locals())
inner()
print(locals())
func()
# UnboundLocalError: local variable 'count' referenced before assignment
# 在没有申明一个nolocal的情况下,定义函数在子局部对父局部的变量进行修改也会报错,原因如下:
# 解释器认为:如果你在局部作用域对一个变量进行修改了,
# 你在局部作用域已经定义好这个变量了。
一句话总结
全局有count = 0 这个变量,或者在函数内部申明一个global count,此时在局部才可以对全局变量进行修改
# 正确的操作方法
count = 0
def func():
global count
count += 1
return count
print(func())