全局变量标志:global
工作中碰见了global全局变量,发现自己不太明白,在这记下来。。。
a = 1
def fun1():
a = 2
print("In fun1 a is:{}".format(a))
def fun2():
global a
a = 2
print("In fun2 a is:{}".format(a))
if __name__ == '__main__':
print("Before fun1 a is:{}".format(a))
fun1()
print("Now a is:{}".format(a))
fun2()
print("After fun2 a is:{}".format(a))
结果为
Before fun1 a is:1
In fun1 a is:2
Now a is:1
In fun2 a is:2
After fun2 a is:2
可以看出在fun1虽然在内部修改了a,但是此时a只是一个局部变量,全局变量a的值依旧为1。
但是
当在fun2中给a加了“global”标签后 再对a进行修改赋值,此时全局变量a就发生了改变。
当全局变量为一个数组时:
a = [1,2,3]
def fun1():
a[1] = 1
print("In fun1 a is:{}".format(a))
def fun2():
global a
a[1] = 3
print("In fun2 a is:{}".format(a))
def fun3():
a = [1,2]
print("In fun1 a is:{}".format(a))
if __name__ == '__main__':
print("Before fun1 a is:{}".format(a))
fun1()
print("Now a is:{}".format(a))
fun2()
print("After fun2 a is:{}".format(a))
fun3()
print("After fun3 a is:{}".format(a))
此时的结果为:
Before fun1 a is:[1, 2, 3]
In fun1 a is:[1, 1, 3]
Now a is:[1, 1, 3]
In fun2 a is:[1, 3, 3]
After fun2 a is:[1, 3, 3]
In fun1 a is:[1, 2]
After fun3 a is:[1, 3, 3]
哟,这个结果就有点神奇了
fun1引用全局变量并修改其中的元素时,虽然没有加global标签,但是a的值却变了!!!
fun2的a(加了global标签)表现平平,没有波澜~~~
fun1表现突出的原因在这里就不说了(个人猜测与python数据的内存引用有关)
结论:
- 想要引用但不修改全局变量,不需要加global标签;
- 想要修改全局变量时,需要加global标签;
- 例外:当变量是列表或元组时,若只修改元素的值,不需要加global标签就可直接修改