Python中變數的作用域
阿新 • • 發佈:2019-01-11
一、變數作用域的含義
變數的作用域說白了就是變數的值從哪裡獲取,或者說變數取值的地方
我們在寫程式碼過程中會用到很多變數,這些變數會出現在各種程式碼塊中,有的出現在函式塊裡,有的在函式塊外,例如:
def n2():
a = 1
b = 2
def n1():
b = 3
print(b)
print(a)
n1()
n2()
結果:
3
1
在這個例子中,對於變數a,b的值,是應該先識別函式中的還是先識別函式外的呢,其實python內部在識別變數的值得時候是有順序的,不是胡亂讀取的,python內部對於獲取變數的值是規定了一個順序的。
二、變數定義域順序
LEGB原則
當你在程式碼裡宣告一個變數後,python會在LEGB四個作用域裡搜尋變數的值,它的搜尋是有順序的,第一步現在L也就是當前最裡層區域性作用域內找,如果沒找到,第二步會跑到包含當前層的上一層作用域E裡找,還沒找到的話,第三部會去模組級的裡面G裡找,最後是去python裡的固定模組裡找。
三、在不同作用域修改變數的值
問題1.,既然對於變數的值的搜尋有順序,如果當前在全局裡已經有變數a的值,我在區域性域裡想修改a的值,怎麼修改呢?
問題2. 如果變數是在上一層的函式裡有值,我想在當前層函式內修改,又如何操作呢?
問題1的解答:對於這種情況需要用到global,在重新給變數a賦值時,要先宣告變數global a,
a = 1
def n():
global a
print(a)
a = 123
print(a)
n()
結果:
1
123
問題2的解答:對於這種情況需要用到nonlocal,在重新給變數a賦值時,要先宣告變數nonlocal a
def n1():
a = 1
def n2():
nonlocal a
a = 2
print(a)
n2()
print(a)
n1()
結果:
2
2
四、哪些情況適用變數的作用域
對於模組,類,函式裡出現的變數就要注意了,它們會引入新的作用域,在這裡如果內部
作用域聲明瞭變數,那麼就用內部變數的值,內部如果沒有宣告,就會使用外部作用域的值