一、變量作用域的含義 變量的作用域說白了就是變量的值從哪里獲取,或者說變量取值的地方 我們在寫代碼過程中會用到很多變量,這些變量會出現(xiàn)在各種代碼塊中,有的出現(xiàn)在函數(shù)塊里,有的在函數(shù)塊外,例如: def n2: a = 1 b = 2 def n1: b = 3 print(b) print(a) n1n2結(jié)果:31 在這個例子中,對于變量a,b的值,是應(yīng)該先識別函數(shù)中的還是先識別函數(shù)外的呢,其實python內(nèi)部在識別變量的值得時候是有順序的,不是胡亂讀取的,python內(nèi)部對于獲取變量的值是規(guī)定了一個順序的。 二、變量定義域順序 LEGB原則 當你在代碼里聲明一個變量后,python會在LEGB四個作用域里搜索變量的值,它的搜索是有順序的,第一步現(xiàn)在L也就是當前最里層局部作用域內(nèi)找,如果沒找到,第二步會跑到包含當前層的上一層作用域E里找,還沒找到的話,第三部會去模塊級的里面G里找,最后是去python里的固定模塊里找。 三、在不同作用域修改變量的值 問題1.,既然對于變量的值的搜索有順序,如果當前在全局里已經(jīng)有變量a的值,我在局部域里想修改a的值,怎么修改呢? 問題2. 如果變量是在上一層的函數(shù)里有值,我想在當前層函數(shù)內(nèi)修改,又如何操作呢? 問題1的解答:對于這種情況需要用到global,在重新給變量a賦值時,要先聲明變量global a, a = 1def n: global a print(a) a = 123 print(a)n結(jié)果:1123 問題2的解答:對于這種情況需要用到nonlocal,在重新給變量a賦值時,要先聲明變量nonlocal a def n1: a = 1 def n2: nonlocal a a = 2 print(a) n2 print(a)n1結(jié)果:22四、哪些情況適用變量的作用域?qū)τ谀K,類,函數(shù)里出現(xiàn)的變量就要注意了,它們會引入新的作用域,在這里如果內(nèi)部 |
|
來自: 元東sntpxtmln9 > 《python》