標籤:lin pre glob error oba 本地 module mod style
知識點:
global將一個變數變為全域變數
nonlocal改變最近的變數,又不是全域作用。
1.global
在python中,當引用一個變數的時候,對這個變數的搜尋按找本地範圍(Local)、嵌套範圍(Encolosing function locals)、全域範圍(Global)、內建範圍(builtins模組)的順序來進行的,即所謂的LEGB規則。
m = 1 #全域def fun1(): m = 2 #嵌套 def fun2(): m = 3 #本地 fun2()fun1()
當在函數中給一個變數賦值的時候,python總是建立或者改變本地範圍的變數名,因此你無法在一個函數外調用函數內的變數,也無法在函數內改變一個函數外的變數。就像下面
#外層無法引用內層變數def fun1(): k = 10fun1()print(k)結果:Traceback (most recent call last): File "I:/untitled/cx/11月/11-17物件導向/1.屬性.py", line 83, in <module> print(k)NameError: name ‘k‘ is not defined#記憶體無法改變外層變數k = 100def fun1(): k = k + 50fun1()print(k)#結果Traceback (most recent call last):...UnboundLocalError: local variable ‘k‘ referenced before assignment
如果在函數中改變函數外的變數或者在函數外調用函數內的變數時,可以使用global。
global可以將一個變數變為全域變數。在內部改變或者在外部參考。
def fun1(): global k k = 50fun1()print(k)或者這樣k = 10def fun1(): global k k = 50fun1()print(k)
2.nonlocal
nonlocal可以在一個嵌套的函數中修改嵌套範圍中的變數,理論上是修改離它最近的變數,但不會改變全域。
#這是正常情況def func3(): n = 1 def func4(): n = 2 def func5(): n = 5 print(n) #5 func5() print(n) #2 func4() print(n) #1func3()
加入nonlocal之後
def func3(): n = 1 def func4(): n = 2 #最近的n = 5 def func5(): nonlocal n n = 5 print(n) #5 func5() print(n) #5 func4() print(n) #1func3()
還可能這樣:
def func3(): n = 1 #這裡最近n =5 def func4(): # n = 2 def func5(): nonlocal n n = 5 print(n) #5 func5() print(n) #5 繼承func3 func4() print(n) #5func3()
不會改變全域
n =100def func3(): n = 1 #這裡最近n =5 def func4(): def func5(): nonlocal n n = 5 print(n) #5 func5() print(n) #5 繼承func3 func4() print(n) #5func3()#結果555100
python中的關鍵字global和nonlocal