1. 程式人生 > >Python筆記之nonlocal語句

Python筆記之nonlocal語句

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

注意:

  1. nonlocal語句允許在記憶體中儲存可變狀態的副本,並且解決了在類無法保證的情況下簡單的狀態儲存。(在示例2中有這樣的體現)
  2. 當執行一條nonlocal語句時,nonlocal名稱必須已經在一個巢狀的def作用域中賦值過,否則將會得到一個錯誤——不能通過在巢狀的作用域給它們一個新值來建立它們(即邊界情況)