python隨筆系列--global和nonlocal關鍵字
阿新 • • 發佈:2019-03-05
nta 全局變量 outer var local rec 無法 assign global global
函數外部定義的變量(即global範圍),在函數內部可以引用,但是不能修改。
如果函數中要使用一個外層(這裏是global)的變量,若函數內部使用global標記該變量,那麽在函數內盡可以“讀取”該變量;若要在函數內修改該global變量,則需要用global語句,函數對該變量的修改也會體現到global作用域。
>>> oo=123 >>> def kai(): print(oo) oo = pp+1 print(oo) >>> kai() Traceback (most recent call last): File "<pyshell#91>", line 1, in <module> kai() File "<pyshell#90>", line 2, in kai print(oo) UnboundLocalError: local variable ‘oo‘ referenced before assignment >>> def kai(): print(oo) #oo = pp+1 print(oo) >>> kai() 123 123 >>> oo+=1 >>> oo 124 >>> kai() 124 124 >>>
但是如下定義函數在函數內部就可以修改全局變量
>>> def kai():
global oo
print(oo)
oo = oo+1
print(oo)
nonlocal
nonlocal指定在當前作用域使用上層作用域中(但排除global作用域)的變量名
nonlocal只能在函數內的函數中使用,如果直接在全局作用域下定義的函數中使用該語句,會報錯
>>> def yun(): nonlocal y #根本就無法繼續書寫語句 SyntaxError: no binding for nonlocal ‘y‘ found
看一個正確使用nonlocal的例子
>>> n=1
>>> def outer():
n=‘n‘
print(n)
def inner():
nonlocal n
n=‘nn‘
print(n)
inn()
print(n)
>>> outer()
n #先打印外層定義的n
nn #內層函數修改了外層函數中的變量n
nn #然後外層函數再打印n就變成了內部函數修改後的值
>>>
再看一個例子
>>> n=1 >>> def outer(): #print(n) n=‘n‘ print(n) def inner(): global n #和上例比這裏改用global #nonlocal n n=‘nn‘ print(n) inner() print(n) >>> outer() n nn n #可以看到外層函數的n並沒有修改 >>> n #而全局變量n被inner函數修改 ‘nn‘
這裏的規則僅是針對不可變元素,如字符串數字等,對於列表或隊列打等可變元素無效。深層原因是向可變對象中增刪改元素並不是對該對象本身的修改
python隨筆系列--global和nonlocal關鍵字