前言
作用域是指變量的生效范圍,例如本地變量、全局變量描述的就是不同的生效范圍。
python的變量作用域的規(guī)則非常簡單,可以說是所有語言中最直觀、最容易理解的作用域。
在開始介紹作用域之前,先拋一個問題:
x=1def f(): x=3 g() print("f:",x) # 3def g(): print("g:",x) # 1f()print("main:",x) # 1上面的代碼將輸出3、1、1。解釋參見再述作用域規(guī)則。另外,個人建議,本文最后一小節(jié)內(nèi)容盡量理解透徹。
python作用域規(guī)則簡介
它有4個層次的作用域范圍:內(nèi)部嵌套函數(shù)、包含內(nèi)部嵌套函數(shù)的函數(shù)自身、全局作用域、內(nèi)置作用域。上面4個作用域的范圍排序是按照從內(nèi)到外,從小到大排序的。

其中:
內(nèi)置作用域是預(yù)先定義好的,在__builtins__模塊中。這些名稱主要是一些關(guān)鍵字,例如open、range、quit等 全局作用域是文件級別的,或者說是模塊級別的,每個py文件中處于頂層的變量都是全局作用域范圍內(nèi)的變量 本地作用域是函數(shù)內(nèi)部屬于本函數(shù)的作用范圍,因為函數(shù)可以嵌套函數(shù),嵌套的內(nèi)層函數(shù)有自身的內(nèi)層范圍 嵌套函數(shù)的本地作用域是屬于內(nèi)層函數(shù)的范圍,不屬于外層所以對于下面這段python代碼來說,如果它處于a.py文件中,且沒有嵌套在其它函數(shù)內(nèi):
X=1def out1(i): X=2 Y='a' print(X) print(i) def in1(n): print(n) print(X,Y) in1(3)out1(2)
那么:
處于全局作用域范圍的變量有:X、out1
處于out1本地作用域范圍的變量有:i、X、Y、in1
處于嵌套在函數(shù)out1內(nèi)部的函數(shù)in1的本地作用域范圍的變量有:n
注意上面的函數(shù)名out1和in1也是一種變量。
如下圖所示:

搜索規(guī)則
當(dāng)在某個范圍引用某個變量的時候,將從它所在的層次開始搜索變量是否存在,不存在則向外層繼續(xù)搜索。搜索到了,則立即停止。
例如函數(shù)ab()中嵌套了一個函數(shù)cd(),cd()中有一個語句print(x),它將首先檢查cd()函數(shù)的本地作用域內(nèi)是否有x,如果沒有則繼續(xù)檢查外部函數(shù)ab()的本地作用域范圍內(nèi)是否有x,如果沒有則再次向外搜索全局范圍內(nèi)的變量x,如果還是沒有,則繼續(xù)搜索內(nèi)置作用域,像"x"這種變量名,在內(nèi)置作用域范圍內(nèi)是不存在的,所以最終沒有搜索到,報錯。如果一開始在cd()中就已經(jīng)找到了變量x,就不會再搜索ab()范圍以及更外層的范圍。
所以,內(nèi)層范圍可以引用外層范圍的變量,外層范圍不包括內(nèi)層范圍的變量。
新聞熱點
疑難解答