Python筆記之nonlocal語句
阿新 • • 發佈:2019-01-02
nonlocal語句
nonlocal語句和global是近親。它和global的不同之處在於,nonlocal應用於一個巢狀的函式的作用域中修改名稱,而不是所有def之外的全域性模組作用域;而且在宣告nonlocal名稱的時候,它必須已經存在於該巢狀函式的作用域中——它們可能只存在於巢狀的函式中,並且不能由一個巢狀的def中的第一次賦值建立。
nonlocal應用
我們先來看一些nonlocal的例子
#示例1 >>> def tester(start): ... state = start ... def nested(label): ... print(label,state) ... return nested ... >>> F = tester(0) >>> F('spam') spam 0 #嘗試在巢狀的def內修改state >>> def tester(start): ... state = start ... def nested(label): ... print(label,state) ... state += 1 ... return nested ... >>> F = tester(0) >>> F('spam') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 4, in nested UnboundLocalError: local variable 'state' referenced before assignment
使用nonlocal進行修改後:
#示例2 >>> def tester(start): ... state = start ... def nested(label): ... nonlocal state ... print(label,state) ... state += 1 ... return nested ... >>> F = tester(0) >>> F('spam') spam 0 >>> F('ham') ham 1 >>> F('YAMAHA') YAMAHA 2 >>> G = tester(45) >>> G('China') China 45 >>> F('re') re 3
注意:
- nonlocal語句允許在記憶體中儲存可變狀態的副本,並且解決了在類無法保證的情況下簡單的狀態儲存。(在示例2中有這樣的體現)
- 當執行一條nonlocal語句時,nonlocal名稱必須已經在一個巢狀的def作用域中賦值過,否則將會得到一個錯誤——不能通過在巢狀的作用域給它們一個新值來建立它們(即邊界情況)