Day11 - 名稱空間和作用域
1、名稱空間(Nmaespace)
名稱空間提供了在專案中避免名字衝突的一種方法。各個名稱空間是獨立的,沒有任何關係的,所以一個名稱空間中不能有重名,但不同的名稱空間是可以重名而沒有任何影響。
分類:
(1)、內建名稱:Python 語言內建的名稱,比如函式名 abs、char 和異常名稱 BaseException、Exception 等等。
(2)、全域性名稱:模組中定義的名稱,記錄了模組的變數,包括函式、類、其它匯入的模組、模組級的變數和常量。
(3)、區域性名稱:函式中定義的名稱,記錄了函式的變數,包括函式的引數和區域性定義的變數。(類中定義的也是)。
變數在名稱空間中查詢的順序:區域性的名稱空間去 -> 全域性名稱空間 -> 內建名稱空間
如果在內建名稱空間中未找到變數,則會報異常。
名稱空間的生命週期:
名稱空間的生命週期取決於物件的作用域,如果物件執行完成,則該名稱空間的生命週期就結束。
因此,我們無法從外部名稱空間訪問內部名稱空間的物件。
2、作用域(Scope)
四種作用域:
(1)、L(Local):最內層,包含區域性變數,比如一個函式/方法的內部。
(2)、E(Enclosing):包含了非區域性(non-local)也非全域性(non-global)的變數。比如兩個巢狀函式,一個函式(或類) A 裡面又包含了一個函式 B ,那麼對於 B 中的名稱來說 A 中的作用域就為 nonlocal。
(3)、G(Global):當前指令碼的最外層,比如當前模組的全域性變數。
(4)、B(Built-in):包含了內建的變數/關鍵字等,最後被搜尋。
搜尋順序:
L ->E -> G-> B。
Python 中只有模組(module),類(class)以及函式(def、lambda)才會引入新的作用域,其它的程式碼塊(如 if/elif/else/、try/except、for/while等)是不會引入新的作用域的,也就是說這些語句內定義的變數,外部也可以訪問。
全域性變數和區域性變數:
定義在函式內部的變數擁有一個區域性作用域,定義在函式外的擁有全域性作用域。
區域性變數只能在其被宣告的函式內部訪問,而全域性變數可以在整個程式範圍內訪問。
global和nonlocal關鍵字:
當內部作用域想修改外部作用域的變數時,就要用到 global 和 nonlocal 關鍵字了。
global關鍵字用於函式內部作用域修改外部作用域的變數值。
nonlocal關鍵字用於修改巢狀作用域(enclosing 作用域,外層非全域性作用域)中的變數。
當然,通過函式傳參也可以達到相同的目的。