全局變量標誌: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標籤就可直接修改