1. 程式人生 > >python隨筆系列--global和nonlocal關鍵字

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

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關鍵字