0%

nonlocal與global關鍵字

之前曾介紹過Python透過LEGB規則來參照變數,今天要介紹有兩個python的關鍵字可以打破這樣的規則

1. global

如果我們需要在函式內部修改global變數,可以使用global來宣告函式內的變數,再進一步作修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var = 5
def access_local():
var = 10
def access_global():
global var
var = 15

>>> print('global is ' + str(var))
global is 5
>>> access_local()
>>> print('global is ' + str(var))
global is 5
>>> access_global()
>>> print('global is ' + str(var))
global is 15

呼叫access_local的函數後,此時依照LEGB的規則,access_local內的var為local變數,因此對var作任何操作都不會影響到global變數。但在呼叫access_global函數後,此時函式內的var經過global宣告後即為global變數,此時對var作的操作就會影響到原本的global變數。

2. nonlocal

nonlocal和global類似,nonlocal用來讓宣告在內層巢狀函式中的變數,不再是local變數,而是轉為外層的enclosed函式的變數。

1
2
3
4
5
6
7
8
9
10
11
12
13
def target_value(x):
def compare(y):
nonlocal x
x = 3
return '> target' if y > x else '< target'
return compare

func = target_value(10)
print(func(5))
> target

print(func.__closure__[0].cell_contents)
3

以之前介紹過的的Closure例子來說明,本來設定10當作x target,當內層函式去捕捉到enclosed的自由變數來比較時,會得到”< target”。本來捕捉到的自由變數只能讀取而無法修改,但是現在在內層函式透過nonlocal來宣告x變數,即可以將local變數轉為外層的enclosed變數,當自由變數x被修改成3之後,最後的比較結果會變數”> target”

參考資料:
python keyword list