我想對Python 3源代碼中的作用域執行一些分析,我被困在nonlocal聲明語句如何在類定義內工作。按照我的理解,類定義在一個新的名字空間(調用它的字典)中執行它的主體,並將類名綁定到類型(name,bases,dict)的結果。非局部x應該工作,只要它引用了一個變量,該變量被綁定在封閉非局部範圍內的某處。在類定義中的Python nonlocal聲明
由此我想到下面的代碼編譯和運行:
class A:
v = 1
class B:
nonlocal v
v = 2
但這種失敗
SyntaxError: no binding for nonlocal 'v' found
,而下面的代碼運行完美
def A():
v = 1
class B:
nonlocal v
v = 2
誰能解釋函數定義的關閉與類定義之間的區別在哪裏?
更多研究 - 在最後的代碼示例中,A中的locals()是{v:1},而B中的{v: 2,'__module__'':''__main__'','__locals__':{...}} – Andyrooger 2011-03-29 00:42:24