# 不可变全局变量,在函数内部修改时,需要加global。# 如果不修改,只访问,无需加global。
m =10deftest(x, y):global m # error if no global m
m +=88; x +=10;y +=10print("inside function m:{}, x:{}, y:{}".format(m, x, y))return x + y+100
a, b, x, y =1,2,66,88
test(a, b)print("outside function m:{}, x:{}, y:{}".format(m,x,y))
result:
inside function m:98, x:11, y:12
outside function m:98, x:66, y:88
# 可变全局变量,在函数内部修改时,可以不加global。# 函数内部变量会屏蔽掉全局变量。
m =[1,2,3]
a, b, x, y =1,2,66,88deftest(x, y):
m.append(8); x +=10;y +=10print("inside function m:{}, x:{}, y:{}".format(m, x, y))return x + y +100
test(a, b)print("outside function m:{}, x:{}, y:{}".format(m,x,y))
result:
inside function m:[1,2,3,8], x:11, y:12
outside function m:[1,2,3,8], x:66, y:88
m =10
list1 =[1,2,3]deffoo():global m
n =0
list2 =[4,5,6]
m +=100defbar():global m # 在嵌套内部函数中改变全局不可变对象, 需要加globalnonlocal n # 在嵌套内部函数中改变外部不可变对象, 需要加nonlocal
m +=20
n +=4
list1.append(66)
list2.append(88)print(m, n, list1, list2)
bar()print(m, n, list1, list2)
foo()print(m, list1)
result:
1304[1,2,3,66][4,5,6,88]1304[1,2,3,66][4,5,6,88]130[1,2,3,66]
Python变量作用域作用域作用域的分类全局变量局部变量变量查找顺序作用域Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里定义的。变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。变量在作用域中查找的顺序是 L→E→G→B。作用域的分类L(Local):最内层,包含局部变量,比如一个函数/方法内部。E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里