關(guān)于 Python 命名空間

在 Python 中,使用命名空間記錄變量。
Python 中的命名空間就像是一個(gè) dict ,key 是變量的名字,value 是變量的值。

  • Python 中,每個(gè)函數(shù)都有一個(gè)自己的命名空間,叫做 local namespace,它記錄了函數(shù)的變量。
  • Python中,每個(gè) module 有一個(gè)自己的命名空間,叫做 global namespace,它記錄了 module 的變量,包括 functions, class 和其它imported modules,還有 module 級別的變量和常量。
  • 還有一個(gè) build-in 命名空間,可以被任意模塊訪問,這個(gè) build-in命名空間中包含了build-in function 和 exceptions。

當(dāng) Python中的某段代碼要訪問一個(gè)變量 x 時(shí),Python 會在所有的命名空間中尋找這個(gè)變量,查找的順序?yàn)?

  • local namespace - 指的是當(dāng)前函數(shù)或者當(dāng)前類方法。如果在當(dāng)前函數(shù)中找到了變量,停止搜索
  • global namespace - 指的是當(dāng)前的模塊。如果在當(dāng)前模塊中找到了變量,停止搜索
  • build-in namespace - 如果在之前兩個(gè)namespace中都找不到變量x,python會假設(shè)x是build-in的函數(shù)或者變量。如果x不是內(nèi)置函數(shù)或者變量,python會報(bào)錯(cuò)NameError。

對于閉包來說,這里有一點(diǎn)區(qū)別,如果在local namespace中找不到變量的話,還會去父函數(shù)的local namespace中找變量。

內(nèi)置函數(shù) locals(), 返回當(dāng)前函數(shù)(方法)的局部命名空間
內(nèi)置函數(shù) globals(),返回當(dāng)前module的命名空間
locals()globals()有一個(gè)區(qū)別是,locals只讀,globals可以寫

from module import 和 import module
使用import module時(shí),module本身被引入,但是保存它原有的命名空間,所以我們需要使用module.name這種方式訪問它的 函數(shù)和變量。
from module import這種方式,是將其它模塊的函數(shù)或者變量引到當(dāng)前的命名空間中,所以就不需要使用module.name這種方式訪問其它的模塊的方法了。

if __name__ trick
python中的module也是對象,所有的modules都有一個(gè)內(nèi)置的屬性name,模塊的name屬性的值取決于如何使用這個(gè)模塊,如果import module,那么name屬性的值是模塊的名字。如果直接執(zhí)行這個(gè)模塊的話,那么name屬性的值就是默認(rèn)值main。

module的一些內(nèi)置屬性

name: 上面已經(jīng)介紹過
file : 當(dāng)前module的絕對路徑
dict
doc
package:
path:

原文:https://blog.csdn.net/u012436149/article/details/72819539

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容