1. 程式人生 > >global和nonlocal的作用

global和nonlocal的作用

這裡看一個基本的例子:

在函式外定義一個變數,內部函式去訪問

a = 1 
def f1():
    def f2():
        a=3   # 這裡的a和函式外面的a是不一致的,可以看列印結果
        print(a)
    f2()
    print('a in f1 : ', a)  # 在函式內可以列印a,但是不能夠運算
f1()
print(a)

列印結果:

  a in f2:  3
  a in f1 :  1
   函式外 1

可以明顯的看到函式外面的a是1,而f2函式中又定義了a=3的值,但是不影響函式外面a的值,說明了函式內部的a是獨立的

2、如果改成這樣的程式碼:

a = 1
def f1():
    def f2():
        a += 3
        print("a in f2: ", a)
    f2()
    print('a in f1 : ', a)  # 在函式內可以列印a,但是不能夠運算
f1()
print("函式外", a)

結果會報錯,說區域性變數a在賦值前被引用。因為函式外面的a不是全域性變數,這個時候想要改變a的值怎麼辦,或者要用a的值,

第一種就是重新在函式內寫一個a,還有就是定義全域性變數global

a = 1
def f1():
    def f2():
        global a   # 定義全域性變數
        a += 3
        print("a in f2: ", a)
        a = 10
    f2()
    print('a in f1 : ', a)  # 在函式內可以列印a,但是不能夠運算
f1()
print("函式外:", a)

結果:

a in f2:  4
a in f1 :  10
函式外: 10

但是這樣就改變原始a的值,並且在定義一個值時,後續的函式在呼叫a的值時,有可能得到不想要的值,所以global一般不要用。
如果在函式內部定義一個變數呢:
程式碼如下:

def f1():
    a = 1
    def f2():
        a = 2
    f2()
    print('a in f1 : ',a)

f1()

結果:
a in f1 : 1

可以看出雖然在f2函式定義了一個a,但是在外面列印的時候還是1
如果在f2裡面加上nonlocal呢,再看下:

def f1():
    a = 1
    def f2():
        nonlocal a
        a = 2
    f2()
    print('a in f1 : ',a)

f1()

結果:
a in f1 : 2

他們的作用就是一個對於函式外的變數,一個在函式內變數。