這期內容當中小編將會給大家帶來有關Python中作用域的原理是什么,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
Python主要應用于:1、Web開發;2、數據科學研究;3、網絡爬蟲;4、嵌入式應用開發;5、游戲開發;6、桌面應用開發。
Python具有靜態作用域,變量的作用域由它定義的位置決定,而與調用的位置無關。
a = 2
def f():
a = 2
第一行的a的作用域是全局作用域,作用于定義位置后面的所有位置。
第四行的a的作用域是局部作用域,作用于f函數里。
Python能夠形成局部作用域的只有函數與類,其他語句不形成局部作用域。
函數與類的局部作用域
def f(): a = 1 class A: b = 2 if 1 == 1: c = 3 for _ in range(1): d = 4 while True: e = 5 break print(c, d, e) try: print(a) except Exception as e: print(e) try: print(b) except Exception as e: print(e)
輸出結果
3 4 5
name 'a' is not defined
name 'b' is not defined
python動態運行時,每個作用域都有三個名字空間:由局部變量組成的local名字空間,由全局變量組成的global名字空間,以及python內建模塊的builtins名字空間,在查詢一個變量時,搜索順序為local->global->builtins,即局部變量屏蔽全局變量,全局變量屏蔽內建變量。
python的global名字空間是動態的,即每遇到一個賦值語句(def與class也屬于賦值語句),global名字空間都可能發生變化。
global名字空間的動態變化
print(dir())
a = 1
print(dir())
b = 2
print(dir())
輸出結果
1 ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
2 ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a']
3 ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'b']
從輸出結果可以看出,global名字空間是動態增加的。
這意味著,雖然位于global名字空間的變量叫做全局變量,它的作用范圍也不是全局位置,它只作用于第一次賦值之后的位置。因為只有在變量賦值初始化的時候,它才會被加入到global名字空間中。
函數和類搜索的global名字空間是調用位置的global名字空間,與定義位置無關
def f(): print(a) try: f() except Exception as e: print(e) a = 2 f()
輸出結果
name 'a' is not defined
2
函數f打印全局變量a,a在第9行定義。在第五行調用f的時候,a不在global名字空間中,所以會輸出錯誤信息,在第十行再次調用函數f時,a已經加入了global名字空間,所以能夠打印出a。
python為了提高效率,local名字空間是靜態實現的,因為對于一個函數來說,它所包含的局部變量是明確已知的。
函數的local名字空間是靜態的
a = 4 def f(): try: print(a) except Exception as e: print(e) a = 1 f()
輸出結果
local variable 'a' referenced before assignment
在打印a的時候,在local名字空間中找到了a,但是這時候a并沒有賦值初始化,所以拋出異常。這也說明了local名字空間與global名字空間不同,它會在一開始就把所有的局部變量加入到名字空間中。
上述就是小編為大家分享的Python中作用域的原理是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。