Python作用域與名字空間原理詳解
Python具有靜態(tài)作用域,變量的作用域由它定義的位置決定,而與調(diào)用的位置無關(guān)。
a = 2 def f(): a = 2
第一行的a的作用域是全局作用域,作用于定義位置后面的所有位置。
第四行的a的作用域是局部作用域,作用于f函數(shù)里。
Python能夠形成局部作用域的只有函數(shù)與類,其他語句不形成局部作用域。
函數(shù)與類的局部作用域
def f(): a = 1class A: b = 2if 1 == 1: c = 3for _ in range(1): d = 4while True: e = 5 breakprint(c, d, e)try: print(a)except Exception as e: print(e)try: print(b)except Exception as e: print(e)
輸出結(jié)果
3 4 5 name ’a’ is not defined name ’b’ is not defined
python動態(tài)運行時,每個作用域都有三個名字空間:由局部變量組成的local名字空間,由全局變量組成的global名字空間,以及python內(nèi)建模塊的builtins名字空間,在查詢一個變量時,搜索順序為local->global->builtins,即局部變量屏蔽全局變量,全局變量屏蔽內(nèi)建變量。
python的global名字空間是動態(tài)的,即每遇到一個賦值語句(def與class也屬于賦值語句),global名字空間都可能發(fā)生變化。
global名字空間的動態(tài)變化
print(dir()) a = 1 print(dir()) b = 2 print(dir())
輸出結(jié)果
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’]
從輸出結(jié)果可以看出,global名字空間是動態(tài)增加的。
這意味著,雖然位于global名字空間的變量叫做全局變量,它的作用范圍也不是全局位置,它只作用于第一次賦值之后的位置。因為只有在變量賦值初始化的時候,它才會被加入到global名字空間中。
函數(shù)和類搜索的global名字空間是調(diào)用位置的global名字空間,與定義位置無關(guān)
def f(): print(a)try: f()except Exception as e: print(e)a = 2f()
輸出結(jié)果
name ’a’ is not defined2
函數(shù)f打印全局變量a,a在第9行定義。在第五行調(diào)用f的時候,a不在global名字空間中,所以會輸出錯誤信息,在第十行再次調(diào)用函數(shù)f時,a已經(jīng)加入了global名字空間,所以能夠打印出a。
python為了提高效率,local名字空間是靜態(tài)實現(xiàn)的,因為對于一個函數(shù)來說,它所包含的局部變量是明確已知的。
函數(shù)的local名字空間是靜態(tài)的
a = 4def f(): try: print(a) except Exception as e: print(e) a = 1f()
輸出結(jié)果
local variable ’a’ referenced before assignment
在打印a的時候,在local名字空間中找到了a,但是這時候a并沒有賦值初始化,所以拋出異常。這也說明了local名字空間與global名字空間不同,它會在一開始就把所有的局部變量加入到名字空間中。
總結(jié):
1. python是靜態(tài)作用域,變量初始化的位置決定了它的作用域,而與變量調(diào)用的位置無關(guān)
2. global名字空間是動態(tài)的,不同位置的global名字空間不同,local名字空間是靜態(tài)的,局部變量在整個局部作用域內(nèi)可見。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. ASP中常用的22個FSO文件操作函數(shù)整理2. 無線標記語言(WML)基礎(chǔ)之WMLScript 基礎(chǔ)第1/2頁3. ASP調(diào)用WebService轉(zhuǎn)化成JSON數(shù)據(jù),附j(luò)son.min.asp4. .Net core 的熱插拔機制的深入探索及卸載問題求救指南5. SharePoint Server 2019新特性介紹6. html清除浮動的6種方法示例7. asp的SQL語句中and和or同時使用的注意事項8. 讀大數(shù)據(jù)量的XML文件的讀取問題9. ASP.NET Core 5.0中的Host.CreateDefaultBuilder執(zhí)行過程解析10. React+umi+typeScript創(chuàng)建項目的過程
