python 中的命名空間,你真的了解嗎?

2022-09-26 19:54:17 字數 2915 閱讀 6836

寫在之前

命名空間,又名 namesapce,是在很多的程式語言中都會出現的術語,估計很多人都知道這個詞,但是讓你真的來說這是個什麼,估計就歇菜了,所以我覺得 「命名空間」 有必要了解一下。

全域性變數 & 區域性變數

全域性變數和區域性變數是我們理解命名空間的開始,我們先來看一段**:

x = 2

def func():

x = 3

print('func x ---> ',x)

func()

print('out of func x ---> ',x)

這段**輸出的結果如下:

func x ---> 3

out of func x ---> 2

從上述的結果中可以看出,執行 func(),輸出的是 func() 裡面的變數 x 所引用的物件 3,之後執行的是**中的最後一行。這裡要區分清楚,前乙個 x 輸出的是函式內部的變數 x,後乙個 x 輸出的是函式外的變數 x,兩個變數互相不影響,在各自的作用域中起作用。

那個只在函式內起作用的變數就叫 「區域性變數」,有了 「區域性」 就有相應的 「全部」,但是後者聽起來有歧義,所以就叫了 「全域性」。

x = 2

def func():

global x = 3 #注意此處

print('func x ---> ',x)

func()

print('out of func x ---> ',x)

這段**中比上段**多加了乙個 global x,這句話的意思是在宣告 x 是全域性變數,通俗點說就是這個 x 和 函式外的 x 是同乙個了,所以結果就成了下面這樣:

func x ---> 3

out of func x ---> 3

這樣乍一看好像全域性變數好強,可以管著函式內外,但是我們還是要注意,全域性變數還是謹慎使用的好rlrii,因為畢竟內外有別,不要帶來混亂。

作用域作用域,用比較直白的方式來說,就是程式中變數與物件存在關聯的那段程式,比如我在上面說的, x = 2 和 x = 3 是在兩個不同的作用域中。

通常的,作用域是被分為靜態作用域和動態作用域,雖然我們說 python 是動態語言,但是它的作用域屬於靜態作用域,即 python 中的變數的作用域是由該變數所在程式中的位置所決定的。

在 python 中作用域被劃分成四個層級,分別是:local(區域性作用域),enclosing(巢狀作用域),global(全域性作用域)和 built - in(內建作用域)。對於乙個變數,python 也是按照之前四個層級依次在不用的作用域中查詢,我們在上一段**中,對於變rlrii量 x,首先搜尋的是函式體內的區域性作用域,然後是函式體外的全域性作用域,至於這段話具體怎麼來理解,請看下面的例子:

def out_func():

x = 2

def in_func():

x = 3

print('in_func x ---> ',x)

in_func()

print('out_func x ---> ',x)

x = 4

out_func()

print('x == 程式設計客棧',x)

仔細觀察一下上面的**和執行的結果,你就會發現變數在不同的範圍內進行搜尋的規律,是不是感覺這些都是以前被你忽略的呢?

命名空間

《維基百科》中說 「命名空間是對作用域的一種特殊的抽象」,在這裡我用乙個比方來具體說明一下:

比如張三在公司 a,他的工號是 111,李四在公司 b,他的工號也是 111,因為兩個人在不同的公司,他們倆的工號可以相同但是不會引起混亂,這裡的公司就表示乙個獨立的命名空間,如果兩個人在乙個公司的話,他們的工號就不能相同,否則光看工號也不知道到底是誰。

其實上面舉的這個例子的特點就是我們使用命名空間的理由,在大型的電腦程式中,往往會出現成百rlrii上千的識別符號,命名空間提供隱藏區域識別符號的機制。通過將邏輯上相關的識別符號構成響應的命名空間,可以使整個系統更加的模組化。

我在開頭引用的《維基百科》的那句話說 「命名空間是對作用域的一種特殊的抽象」,它其實包含了處於該作用域內的識別符號,且它本身也用乙個識別符號來表示。在 python 中,命名空間本身的識別符號也屬於更外層的乙個命名空間,所以命名空間也是可以巢狀的,它們共同生活在 「全域性命名空間」 下。

簡言之,不同的命名空間可以同時存在,但是彼此獨立,互不干擾。當然了,命名空間因為其物件的不同也有所區別,可以分為以下幾種:

1.本地命名空間:模組中有函式或者類的時候,每個函式或者類所定義的命名空間即是本地命名空間,當函式返回結果或者丟擲異常的時候,本地命名空間也就結束了。

2.全域性命名空間:每個模組建立了自己所擁有的全域性命名空間,不同模組的全域性命名空間彼此獨立,不同模組中相同名稱的命名空間也會因為模組的不同而不相互干擾。

3.內建命名空間:當 python 執行起來的時候,它們就存在了,內建函式的命名空間都屬於內建命名空間所以我們可以在任何程式中直接執行它們。

程式查詢命名空間的時候也有一套順序,依次按照本地命名空間 ,全域性命名空間,內建命名空間。

def fun(like):

name = 'rocky'

print(locals())

fun('python')

訪問本地命名空間使用 locals 完成,我們來看一下結果:

從上面的結果中可以看出,命名空間中的資料儲存的結構和字典是一樣的。可能你已經猜到了,當我們要訪問全域性命名空間的時候,可以使用 globals。

關於命名空間還有乙個生命週期的問題,就是乙個命名空間什麼時候出現,什麼時候消失,這個很好理解,就是哪部分被讀入記憶體,哪部分的命名空間就存在了,比如我們在上面說的,python 啟動,內建命名空間就建立。

寫在之後

至此,我的零基礎學習 python 計畫裡關於函式的部分就結束了,這一部分寫的時間超出了我原本的計畫,但是在寫的過程中覺得有些知識點還是說說的好,從下週開始,就要開始 「類」 這一部分的學習啦,希望我們還可以繼續這麼走下去,我堅持寫,你也堅持學。

還有堅持。。點個贊。。

python中的命名空間

命名空間就是存放變數名和函式名的空間。如果你想訪問乙個變數值,必須先訪問對應的命名空間,拿到名字和對應記憶體位址的繫結關係。1 內建命名空間 python提前定義好的名字,就是存在於內建命名空間 2 全域性命名空間 存放於檔案級別的名字,就叫做全域性命名空間 在全域性空間下 if while for...

Python 命名空間

本文介紹python中命名空間中的legb原則。legb含 釋 l local function 函式內的名字空間,包括區域性變數和形參 e enclosing function locals 外部巢狀函式的名字空間 例如closure g global module 函式定義所在模組 檔案 的名字...

python 命名空間

作用域 第五章說過,將輸入字元作為命令放在作用域字典裡 作用域,每個函式都有乙個作用域,就是 字典,字典名字為函式名,鍵為變數,鍵值為變數對應的賦值。函式的作用域為區域性作用域 在函式內部訪問全域性變數,且只是讀取變數的值不重新繫結變數。這樣引用易出錯誤。慎重使用全域性變數 defcombine p...