在 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