- L(Local):最内层,包含局部变量,比如一个函数/方法内部。
- E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
- G(Global):当前脚本的最外层,比如当前模块的全局变量。
- B(Built-in): 包含了内建的变量/关键字等,最后被搜索。
查找变量的顺序:?L –> E –> G –> B
global 和 nonlocal
var1 = 123
def func():
# 定义var1,var2为全局变量
global var1, var2
print(var1)
var1 += 1
var2 = 1
print(var1)
def func4():
print(var1) # 不改变全局变量值,只输出,这样是能正常运行的
# var1 += 1 # 改变全局变量值 这样是会报错的
# print(var1)
def func5():
var1 = 1
print(var1) # 此时输出的是 局部变量var1的值,不会改变全局变量var1
var1 += 1
print(var1) # 此时输出的是 局部变量var1的值,不会改变全局变量var1
func5()
print(var1)
func4()
func()
print(var1)
print(var2)
def func2():
v1 = 123
def func3():
nonlocal v1 # nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量
print(v1)
v1 += 1
var2 = 1
print(v1)
func3()
print(v1)
func2()
|