# 不可变全局变量,在函数内部修改时,需要加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]