一、global
1、global關鍵字用來在函數或其他局部作用域中使用全局變量。但是如果不修改全局變量也可以不使用global關鍵字。
gcount = 0 def global_test(): gcount+=1 print (gcount) global_test()
以上代碼會報錯:第一行定義了全局變量,在內部函數中又對外部函數進行了引用並修改,那么python會認為它是一個局部變量,有因為內部函數沒有對其gcount進行定義和賦值,所以報錯。
2、如果局部要對全局變量修改,則在局部聲明該全局變量
gcount = 0 def global_test(): global gcount gcount+=1 print (gcount) global_test()
以上輸出為:1
3、如果局部不聲明全局變量,並且不修改全局變量,則可以正常使用
gcount = 0 def global_test(): print (gcount) global_test()
以上輸出為:0
二、nonlocal
1、 nonlocal聲明的變量不是局部變量,也不是全局變量,而是外部嵌套函數內的變量
def make_counter(): count = 0 def counter(): nonlocal count count += 1 return count return counter def make_counter_test(): mc = make_counter() print(mc()) print(mc()) print(mc()) make_counter_test()
以上輸出為:
1
2
3
三、混合使用
def scope_test(): def do_local(): spam = "local spam" #此函數定義了另外的一個spam字符串變量,並且生命周期只在此函數內。此處的spam和外層的spam是兩個變量,如果寫出spam = spam + “local spam” 會報錯 def do_nonlocal(): nonlocal spam #使用外層的spam變量 spam = "nonlocal spam" def do_global(): global spam spam = "global spam" spam = "test spam" do_local() print("After local assignmane:", spam) do_nonlocal() print("After nonlocal assignment:",spam) do_global() print("After global assignment:",spam) scope_test() print("In global scope:",spam)
以上輸出為:
After local assignmane: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam