在閱讀本文之前,請(qǐng)確保您已掌握Python全局,局部和非局部變量的一些基礎(chǔ)知識(shí)。
在Python中,global關(guān)鍵字允許您在當(dāng)前作用域之外修改變量。它用于創(chuàng)建全局變量并在局部上下文中對(duì)該變量進(jìn)行更改。
Python中g(shù)lobal關(guān)鍵字的基本規(guī)則是:
當(dāng)我們?cè)诤瘮?shù)內(nèi)部創(chuàng)建變量時(shí),默認(rèn)情況下它是局部的。
當(dāng)我們?cè)诤瘮?shù)外部定義變量時(shí),默認(rèn)情況下它是全局的。您不必使用global關(guān)鍵字。
我們使用global關(guān)鍵字在函數(shù)內(nèi)部讀寫全局變量。
在函數(shù)外使用global關(guān)鍵字無(wú)效
讓我們舉個(gè)實(shí)例。
c = 1 # 全局變量 def add(): print(c) add()
當(dāng)我們運(yùn)行上面的程序時(shí),輸出將是:
1
但是,在某些情況下,我們需要從函數(shù)內(nèi)部修改全局變量。
c = 1 # 全局變量 def add(): c = c + 2 # increment c by 2 print(c) add()
當(dāng)我們運(yùn)行上面的程序時(shí),輸出顯示錯(cuò)誤:
UnboundLocalError: local variable 'c' referenced before assignment
這是因?yàn)槲覀冎荒茉L問(wèn)全局變量,而不能從函數(shù)內(nèi)部對(duì)其進(jìn)行修改。
解決方案是使用global關(guān)鍵字。
c = 0 # 全局變量 def add(): global c c = c + 2 # increment by 2 print("Inside add():", c) add() print("In main:", c)
當(dāng)我們運(yùn)行上面的程序時(shí),輸出將是:
Inside add(): 2 In main: 2
在上面的程序中,我們將c定義為add()函數(shù)內(nèi)部的全局關(guān)鍵字。
然后,將變量c增加1,即c = c + 2。之后,我們調(diào)用該add()函數(shù)。最后,我們打印全局變量c。
如我們所見,函數(shù)之外的全局變量也發(fā)生了變化c = 2。
在Python中,我們創(chuàng)建一個(gè)模塊config.py來(lái)保存全局變量,并在同一程序中的Python模塊之間共享信息。
這是我們?nèi)绾卧趐ython模塊之間共享全局變量。
創(chuàng)建一個(gè)config.py文件,以存儲(chǔ)全局變量
a = 0 b = "empty"
創(chuàng)建一個(gè)update.py文件,更改全局變量
import config config.a = 10 config.b = "alphabet"
創(chuàng)建一個(gè)main.py文件,以測(cè)試值的變化
import config import update print(config.a) print(config.b)
當(dāng)我們運(yùn)行main.py文件時(shí),輸出將是
10 alphabet
在上文中,我們創(chuàng)建三個(gè)文件:config.py,update.py和main.py。
該模塊config.py存儲(chǔ)a和b的全局變量。在update.py文件中,我們導(dǎo)入config.py模塊并修改a和b的值。同樣,在main.py文件中,我們同時(shí)導(dǎo)入config.py和update.py模塊。最后,我們打印并測(cè)試全局變量的值,無(wú)論它們是否更改。
這是在嵌套函數(shù)中使用全局變量的方法。
def foo(): x = 20 def bar(): global x x = 25 print("在調(diào)用bar之前: ", x) print("立即調(diào)用bar") bar() print("在調(diào)用bar之后: ", x) foo() print("x在主體內(nèi): ", x)
輸出為:
在調(diào)用bar之前: 20 立即調(diào)用bar 在調(diào)用bar之后: 20 x在主體內(nèi): 25
在上面的程序中,我們?cè)谇短椎暮瘮?shù)bar()中聲明全局變量。在foo()函數(shù)中,x對(duì)全局關(guān)鍵字沒(méi)有影響。
在調(diào)用bar之前和之后,變量x接受局部變量的值,即x =20。在foo函數(shù)之外,變量x將采用bar函數(shù)中定義的值,即x =25。這是 因?yàn)槲覀冊(cè)趚中使用了global關(guān)鍵字在bar函數(shù)(局部作用域)內(nèi)創(chuàng)建了全局變量。
如果我們?cè)赽ar()函數(shù)中做了任何更改,那么這些更改就會(huì)出現(xiàn)在局部作用域之外,即foo()。