1. 程式人生 > >Python中變數的作用域

Python中變數的作用域

一、變數作用域的含義

變數的作用域說白了就是變數的值從哪裡獲取,或者說變數取值的地方

我們在寫程式碼過程中會用到很多變數,這些變數會出現在各種程式碼塊中,有的出現在函式塊裡,有的在函式塊外,例如:

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

四、哪些情況適用變數的作用域
對於模組,類,函式裡出現的變數就要注意了,它們會引入新的作用域,在這裡如果內部
作用域聲明瞭變數,那麼就用內部變數的值,內部如果沒有宣告,就會使用外部作用域的值