1、變量做用域的含義python
變量的做用域說白了就是變量的值從哪裏獲取,或者說變量取值的地方函數
咱們在寫代碼過程當中會用到不少變量,這些變量會出如今各類代碼塊中,有的出如今函數塊裏,有的在函數塊外,例如:spa
def n2():
a = 1
b = 2
def n1():
b = 3
print(b)
print(a)
n1()
n2()
結果:
3
1
在這個例子中,對於變量a,b的值,是應該先識別函數中的仍是先識別函數外的呢,其實python內部在識別變量的值得時候是有順序的,不是胡亂讀取的,python內部對於獲取變量的值是規定了一個順序的。作用域
2、變量定義域順序變量
LEGB原則搜索
當你在代碼裏聲明一個變量後,python會在LEGB四個做用域裏搜索變量的值,它的搜索是有順序的,第一步如今L也就是當前最裏層局部做用域內找,若是沒找到,第二步會跑到包含當前層的上一層做用域E裏找,還沒找到的話,第三部會去模塊級的裏面G裏找,最後是去python裏的固定模塊裏找。co
3、在不一樣做用域修改變量的值
問題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()結果:224、哪些狀況適用變量的做用域對於模塊,類,函數裏出現的變量就要注意了,它們會引入新的做用域,在這裏若是內部做用域聲明瞭變量,那麼就用內部變量的值,內部若是沒有聲明,就會使用外部做用域的值