一、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
