在Python 3.3.1中,這有效:i = 76def A(): global i i += 10print(i) # 76A()print(i) # 86這也適用:def enclosing_function(): i = 76 def A(): nonlocal i i += 10 print(i) # 76 A() print(i) # 86enclosing_function()但這不起作用:i = 76def A(): nonlocal i # "SyntaxError: no binding for nonlocal 'i' found" i += 10print(i)A()print(i)nonlocal關鍵字狀態的文檔(添加了重點):非本地語句使列出的標識符引用最近的封閉范圍中的先前綁定的變量。在第三個示例中,“最近封閉范圍”恰好是全局范圍。那為什么不起作用呢?請閱讀此位我確實注意到文檔繼續說明(強調):[ nonlocal]語句允許封裝的代碼在全局(模塊)范圍之外的本地范圍之外重新綁定變量。但是,嚴格來說,這并不意味著我在第三個示例中所做的不起作用。
3 回答

Smart貓小萌
TA貢獻1911條經驗 獲得超7個贊
名稱的搜索順序為LEGB,即本地,封閉,全局,內置。因此,全局范圍不是封閉范圍。
編輯
從文檔:
非本地語句使列出的標識符引用最近的封閉范圍中的先前綁定的變量。這很重要,因為綁定的默認行為是首先搜索本地名稱空間。該語句允許封裝的代碼在全局(模塊)作用域之外的本地作用域之外重新綁定變量。

慕無忌1623718
TA貢獻1744條經驗 獲得超4個贊
為什么將模塊的作用域視為全局作用域而不是封閉的作用域?它對于其他模塊仍然不是全局的(嗯,除非您這樣做了
from module import *
),對嗎?
如果您在的名稱module
空間中添加了一些名稱;它在使用的任何模塊中都是可見的,module
即,它在整個Python過程中都是全局的。
通常,您的應用程序應使用盡可能少的可變全局變量。請參閱為什么全局變量不好?:
非地區性
無訪問控制或約束檢查
隱式耦合
并發問題
命名空間污染
測試與禁閉
因此,如果nonlocal
允許偶然創建全局變量將是不好的。如果要修改全局變量;您可以global
直接使用關鍵字。
global
是最具破壞性的:可能會影響程序中模塊的所有使用nonlocal
破壞性較小:受external()函數作用域的限制(在編譯時檢查綁定)沒有聲明(局部變量)是破壞性最小的選項:受inner()函數作用域的限制
您可以nonlocal
在《PEP:3104訪問外部范圍中的名稱》中了解其背后的歷史和動機。
添加回答
舉報
0/150
提交
取消