之前曾介紹過Python透過LEGB規則來參照變數,今天要介紹有兩個python的關鍵字可以打破這樣的規則
1. global
如果我們需要在函式內部修改global變數,可以使用global來宣告函式內的變數,再進一步作修改
1 | var = 5 |
呼叫access_local的函數後,此時依照LEGB的規則,access_local內的var為local變數,因此對var作任何操作都不會影響到global變數。但在呼叫access_global函數後,此時函式內的var經過global宣告後即為global變數,此時對var作的操作就會影響到原本的global變數。
2. nonlocal
nonlocal和global類似,nonlocal用來讓宣告在內層巢狀函式中的變數,不再是local變數,而是轉為外層的enclosed函式的變數。
1 | def target_value(x): |
以之前介紹過的的Closure例子來說明,本來設定10當作x target,當內層函式去捕捉到enclosed的自由變數來比較時,會得到”< target”。本來捕捉到的自由變數只能讀取而無法修改,但是現在在內層函式透過nonlocal來宣告x變數,即可以將local變數轉為外層的enclosed變數,當自由變數x被修改成3之後,最後的比較結果會變數”> target”
參考資料:
python keyword list