global和nonlocal的作用
阿新 • • 發佈:2019-01-27
這裡看一個基本的例子:
在函式外定義一個變數,內部函式去訪問
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
他們的作用就是一個對於函式外的變數,一個在函式內變數。