python隨筆系列--global和nonlocal關鍵字

global

函數外部定義的變量(即global範圍),在函數內部能夠引用,可是不能修改。
若是函數中要使用一個外層(這裏是global)的變量,若函數內部使用global標記該變量,那麼在函數內盡能夠「讀取」該變量;若要在函數內修改該global變量,則須要用global語句,函數對該變量的修改也會體現到global做用域。shell

>>> 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
>>>

可是以下定義函數在函數內部就能夠修改全局變量ide

>>> def kai():
    global oo
    print(oo)
    oo = oo+1
    print(oo)

nonlocal

nonlocal指定在當前做用域使用上層做用域中(但排除global做用域)的變量名 函數

nonlocal只能在函數內的函數中使用,若是直接在全局做用域下定義的函數中使用該語句,會報錯code

>>> 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'

這裏的規則僅是針對不可變元素,如字符串數字等,對於列表或隊列打等可變元素無效。深層緣由是向可變對象中增刪改元素並非對該對象自己的修改作用域

相關文章
相關標籤/搜索