Python global變量

1. 常用情況:

  按照我們常用的python全局變量的概念,只要定義了就可以在函數中使用,但其實直接使用全局變量會報錯:

#usr/bin/python
#encoding=utf-8
sumAB = 0
def printSumAB(a,b):
    print sumAB
    sumAB = a+b
    print sumAB
printSumAB(1,2)

輸出錯誤信息:

Traceback (most recent call last):
  File "/Users/name/PycharmProjects/untitled/understandGlobal.py", line 8, in <module>
    printSumAB(1,2)
  File "/Users/name/PycharmProjects/untitled/understandGlobal.py", line 5, in printSumAB
    print sumAB
UnboundLocalError: local variable 'sumAB' referenced before assignment

  也就是說我們在函數裏打印sumAB的操作是不合法的——雖然在函數外我們已經聲明瞭一個全局的sumAB,但實際上,這樣的聲明的變量,在局部進行引用或修改是有問題的,我們可以通過查看變量id進行對比:

#usr/bin/python
#encoding=utf-8
sumAB = 0
print id(sumAB)
def printSumAB(a,b):
    sumAB = a+b
    print id(sumAB)
printSumAB(1,2)
print id(sumAB)

輸出結果:

#上面打印的三次sumAB的id
140626682200208
140626682200136
140626682200208

  通過上面輸出兩個sumAB的id可以發現,函數中的sumAB的id與我們以爲的全局變量的id不同,這樣操作也沒有成功修改函數外sunAB的值……

2.藉助global聲明:

那到底要怎樣引用並修改這個全局變量呢?
這個時候就需要藉助global啦:

#usr/bin/python
#encoding=utf-8
sumAB = 0
print '最早的sumAB的id',id(sumAB)
def printsumAB(a,b):
    global sumAB
    print '初始sumAB = ',sumAB
    print '初始sumAB的id = ',id(sumAB)
    sumAB = a+b
    print '修改後的sumAB = ',sumAB
    print '修改後的sumAB的id = ',id(sumAB)
printsumAB(1,2)
print '最終的sumAB = ',sumAB
print '最終的sumAB的id = ',id(sumAB)

打印結果:

最早的sumAB的id 140430981252272
初始sumAB =  0
初始sumAB的id =  140430981252272
修改後的sumAB =  3
修改後的sumAB的id =  140430981252200
最終的sumAB =  3
最終的sumAB的id =  140430981252200

  這個時候,可以發現,成功的修改了我們想要改變的全局變量(^-^)而關鍵點,就是要聲明“global”;但是有時候爲什麼我們沒有聲明global,還是可以使用全局變量呢?
  ——引用全局變量時,不需要global聲明;但是後面使用或者修改這個全局變量的時候,需要global聲明~~~不然就會報錯

3.【補充說明】

  在'main'這個程序入口修改修改全局變量,就不需要再用global聲明瞭:

#usr/bin/python
#encoding=utf-8
sumAB = 0
print '最早的sumAB的id',id(sumAB)
if __name__ == '__main__':
    global sumAB
    sumAB = sumAB+1
    print '最終的sumAB = ', sumAB
    print '最終的sumAB的id = ', id(sumAB)

輸出結果:

/Users/name/PycharmProjects/virtual/bin/python /Users/name/PycharmProjects/untitled/understandGlobal.py
/Users/name/PycharmProjects/untitled/understandGlobal.py:20: SyntaxWarning: name 'sumAB' is assigned to before global declaration
最早的sumAB的id 140546367576960
  global sumAB
最終的sumAB =  1
最終的sumAB的id =  140546367576936

  從以上輸出結果可以看出,程序運行沒有報錯,也成功修改全局變量sumAB,但給出了警告,表示在聲明爲全局變量前,它已經被賦值了……

這個時候我們去掉global聲明,再試一次:

#usr/bin/python
#encoding=utf-8
sumAB = 0
print '最早的sumAB的id',id(sumAB)
if __name__ == '__main__':
    # global sumAB
    sumAB = sumAB+1
    print '最終的sumAB = ', sumAB
    print '最終的sumAB的id = ', id(sumAB)

打印結果:

最早的sumAB的id 140352440784096
最終的sumAB =  1
最終的sumAB的id =  140352440784072

沒有出現報錯,而且成功修改了全局變量~

  個人理解是,main作爲程序執行入口,本身就可以理解爲是一個全局的概念,即使用在if下面,但是也仍然是針對全局而言,所以這個時候修改全局變量是全局的,不需要擔心出現一個新的局部變量~

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章