1. 程式人生 > 其它 >Day11 - 名稱空間和作用域

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 作用域,外層非全域性作用域)中的變數。

當然,通過函式傳參也可以達到相同的目的。