1、global關鍵字用來在函式或其他區域性作用域中使用全域性變數。但是如果不修改全域性變數也可以不使用global關鍵字,global適用於函式內部修改全域性變數的值
2、nonlocal關鍵字用來在函式或其他作用域中使用外層(非全域性)變數。nonlocal適用於巢狀函式中內部函式修改外部變數的值如果
沒有使用以上關鍵字,對全域性變數或者外部變數進行修改,python會預設將全域性變數隱藏起來,就會報錯。而如果僅僅是使用變數,就可以不用加上述關鍵字。
例如:nonlocal:
def make_counter(x):
count=12
def counter(y):
#nonlocal count
#count +=1
#print(count)
return count,x*y
return counter
print(make_counter(1)(2))
執行結果是:(12, 2) 僅使用,不修改
def make_counter(x):
count=12
def counter(y):
#nonlocal count
count +=1
#print(count)
return count,x*y
return counter
print(make_counter(1)(2))
報錯:unboundlocalerror: local variable 'count' referenced before assignment ,修改必須加nonlocal
def make_counter(x):
count=12
def counter(y):
nonlocal count
count +=1
#print(count)
return count,x*y
return counter
print(make_counter(1)(2))
執行結果是:(13, 2) 加上nonlocal,修改。
例如 glocal:
x=12
def func():
#global x
x+=12
print(x)
return x*x,x
print(func())
報錯:unboundlocalerror: local variable 'x' referenced before assignment
x=12
def func():
global x
x+=12
print(x)
return x*x,x
print(func())
執行結果:
24(576, 24)
global x
x=12
def func():
x+=12
print(x)
return x*x,x
print(func())
報錯:unboundlocalerror: local variable 'x' referenced before assignment 必須在函式裡面加上global.
公升級版例項:
def make_counter(x):
count=12
def counter(y):
nonlocal count
count +=1
#print(count)
return count,x*y
return counter
def make_counter_text():
mc = make_counter(1)
print(mc(2))
print(mc(2))
print(mc(2))
make_counter_text()
執行結果:
(13, 2)
(14, 2)
(15, 2)
問題:為什麼count還會儲存?
解答:因為有語句mc = make_counter(1)的存在,使函式中執行環境儲存下來,count沒有釋放,導致疊加。
global和nonlocal作用域
python中的變數引用順序為 當前作用域區域性變數 外層作用域變數 當前模組中的全域性變數 python內建變數 global關鍵字的作用就是用來在函式或者其他區域性作用域中使用全域性變數 例如 a 0 這裡報錯原因是因為剛開始在第一行就定義了乙個全域性變數a 而之後我們嘗試修改了這個a的值,此時...
函式中的global和nonlocal
區域性作用域對全域性作用域的變數 此變數只能是不可變的資料型別 只能進行引用,而不能進行改變,只要改變就會報錯,但是有些時候,我們程式中會遇到區域性作用域去改變全域性作用域的一些變數的需求,這怎麼做呢?這就得用到關鍵字global global第乙個功能 在區域性作用域中可以更改全域性作用域的變數。...
global和 nonlocal關鍵字
例如 def handu global a 利用外邊的a執行函式 a 10 print 函式內部 a a 20 handu print 外部函式 a 結果 函式內部 30 函式外部 30 開始分析 global關鍵字可以將區域性變數變成乙個全域性變數所以都是30 30 def hanfu globa...