nonlocal
和 global
也很容易混淆。簡單記錄下本身的理解。python
總之一句話,做用域是全局的,就是會修改這個變量對應地址的值。程序員
global
語句是一個聲明,它適用於整個當前代碼塊。 這意味着列出的標識符將被解釋爲全局變量。 儘管自由變量可能指的是全局變量而不被聲明爲全局變量。segmentfault
global
語句中列出的名稱不得用於該全局語句以前的文本代碼塊中。閉包
global
語句中列出的名稱不能定義爲形式參數,也不能在 for
循環控制目標、class
定義、函數定義、import
語句或變量註釋中定義。函數
當前的實現並不強制執行這些限制,可是程序不該該濫用這種自由,由於將來的實現可能會強制執行這些限制,或者悄悄地改變程序的含義。spa
程序員注意:global
是指向解析器的指令。 它僅適用於與全局語句同時解析的代碼。 特別是,包含在提供給內置exec()
函數的字符串或代碼對象中的全局語句不會影響包含函數調用的代碼塊,並且這種字符串中包含的代碼不會受包含函數調用的代碼中的全局語句的影響。eval()
和compile()
函數也是如此。
只在閉包裏面生效,做用域就是閉包裏面的,外函數和內函數都影響,可是閉包外面不影響。code
nonlocal
語句使列出的標識符引用除global
變量外最近的封閉範圍中的之前綁定的變量。 這很重要,由於綁定的默認行爲是首先搜索本地名稱空間。 該語句容許封裝的代碼將變量從新綁定到除全局(模塊)做用域以外的本地做用域以外。對象
nonlocal
語句中列出的名稱與global
語句中列出的名稱不一樣,它們必須引用封閉範圍中已經存在的綁定(沒法明確肯定應在其中建立新綁定的範圍)。blog
沒有用 nonlocal
和 global
圖片
x = 0 def outer(): x = 1 def inner(): x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x) # inner: 2 # outer: 1 # global: 0
nonlocal
的做用範圍
x = 0 def outer(): x = 1 def inner(): nonlocal x x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x) # inner: 2 # outer: 2 # global: 0
global
的做用範圍
x = 0 def outer(): x = 1 def inner(): global x x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x) # inner: 2 # outer: 1 # global: 2
global
,就不能在再聲明爲nonlocal
x = 0 def outer(): global x x = 1 def inner(): nonlocal x x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x) # SyntaxError: no binding for nonlocal 'x' found
nonlocal
以前須要初始化變量x = 0 def outer(): def inner(): nonlocal x x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x) # SyntaxError: no binding for nonlocal 'x' found
nonlocal
x = 0 def outer(): x = 1 nonlocal x def inner(): x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x) # SyntaxError: name 'x' is assigned to before nonlocal declaration
若是你感興趣能夠關注公衆號「chasays」- 程序員匯聚地