Python的命名空間是Python程序猿必須了解的內容,對Python命名空間的學習,將使我們在本質上掌握一些Python中的瑣碎的規則。
接下來我將分四部分揭示Python命名空間的本質:一、命名空間的定義;二、命名空間的查找順序;三、命名空間的生命周期;四、通過locals()和globals() BIF訪問命名空間
重點是第四部分,我們將在此部分觀察命名空間的內容。
一、命名空間
Python使用叫做命名空間的東西來記錄變量的軌跡。命名空間是一個 字典(dictionary) ,它的鍵就是變量名,它的值就是那些變量的值。
A namespace is a mapping from names to objects. Most namespaces are currently implemented as Python dictionaries。
在一個 Python 程序中的任何一個地方,都存在幾個可用的命名空間。
1、每個函數都有著自已的命名空間,叫做局部命名空間,它記錄了函數的變量,包括函數的參數和局部定義的變量。
2、每個模塊擁有它自已的命名空間,叫做全局命名空間,它記錄了模塊的變量,包括函數、類、其它導入的模塊、模塊級的變量和常量。
3、還有就是內置命名空間,任何模塊均可訪問它,它存放著內置的函數和異常。
名稱空間的加載順序
內置命名空間(程序運行前加載)-->全局命名空間(程序運行中:從上到下加載)-->局部命名空間(程序運行中:調用時才加載)
二、名稱空間的取值順序
在局部調用:局部命名空間-->全局命名空間-->內置命名空間
在全局調用:全局命名空間-->內置命名空間
綜上所述,在尋找變量時,從小范圍,一層一層到大范圍去找尋。
三、命名空間查找順序
當一行代碼要使用變量 x 的值時,Python 會到所有可用的名字空間去查找變量,按照如下順序:
1、局部命名空間:特指當前函數或類的方法。如果函數定義了一個局部變量 x,或一個參數 x,Python 將使用它,然后停止搜索。
2、全局命名空間:特指當前的模塊。如果模塊定義了一個名為 x 的變量,函數或類,Python 將使用它然后停止搜索。
3、內置命名空間:對每個模塊都是全局的。作為最后的嘗試,Python 將假設 x 是內置函數或變量。
4、如果 Python 在這些名字空間找不到 x,它將放棄查找并引發一個 NameError 異常,如,NameError: name 'aa' is not defined。
嵌套函數的情況:
1、先在當前 (嵌套的或 lambda) 函數的命名空間中搜索
2、然后是在父函數的命名空間中搜索
新聞熱點
疑難解答