python 名稱空間與作用域詳情

函數內部的函數隻能在函數內部調用,不能在函數外部調用,通過接下來的學習你將會知道為什麼會出現這種情況。

一、名稱空間

名稱空間(name spaces):在內存管理那一章節時,我們曾說到變量的創建其實就是在內存中開辟瞭一個新的空間。但是我們一直在回避變量名的存儲,其實在內存中有一塊內存空間存儲變量名與變量間的綁定關系的空間,而這個空間稱為名稱空間,真正存名字的地方是棧區,名稱空間隻是把棧區分成為幾個部分,有瞭名稱空間我們就可以在棧區存放相同的名字。

1.1 內置名稱空間

內置名稱空間:存放Pyhton解釋器自帶的名字,如intfloatlen

生命周期:在解釋器啟動時生效,在解釋器關閉時失效

1.2 全局名稱空間

全局名稱空間:除瞭內置和局部的名字之外,其餘都存放在全局名稱空間,如下面代碼中的xfunclz

生命周期:在文件執行時生效,在文件執行結束後失效

1.3 局部名稱空間

局部名稱空間:用於存放函數調用期間函數體產生的名字,如下面代碼的f2

生命周期:在文件執行時函數調用期間時生效,在函數執行結束後失效

註意:即使是對同一個函數,即便它是空函數,如果我們對它進行多次調用的話,調用一次產生一個局部名稱空間,

1.4 加載順序

由於.py文件是由Python解釋器打開的,因此一定是在Python解釋器中的內置名稱空間加載結束後,文件才開始打開,這個時候才會產生全局名稱空間,但文件內有某一個函數被調用的時候,才會開始產生局部名稱空間,因此名稱空間的加載順序為:內置–》全局–》局部。

1.5 查找順序

由於名稱空間是用來存放變量名與值之間的綁定關系的,所以但凡要查找名字,一定是從三者之一找到,查找順序為:
從當前的所在位置開始查找,如果當前所在的位置為局部名稱空間,則查找順序為:局部–》全局–》內置。

二、作用域

域指的是區域,作用域即作用的區域。

2.1 全局作用域

全局作用域:全局有效,被所有的函數共享,包含內置名稱空間和全局名稱空間。

2.2 局部作用域

局部作用域:局部有小,臨時存儲,隻包含局部名稱空間。

2.3 註意點

需要註意的是:作用域關系在函數定義階段就固定死瞭,與函數的調用無關。

2.4 函數對象+作用域應用

三、補充知識點

3.1 global關鍵字

修改全局作用域中的變量。

3.2 nonlocal關鍵字

修改局部作用域中的變量。

3.3 註意點

  • 在局部想要修改全局的可變類型,不需要任何聲明,可以直接修改。
  • 在局部如果想要修改全局的不可變類型,需要借助global聲明,聲明為全局的變量,即可直接修改。

到此這篇關於python 名稱空間與作用域詳情的文章就介紹到這瞭,更多相關python 名稱空間與作用域內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: