python
使用命名空間記錄變量。python
中的命名空間就像是一個dict
,key
是變量的名字,value
是變量的值。python
python
中,每一個函數都有一個本身的命名空間,叫作local namespace
,它記錄了函數的變量。python
中,每一個module
有一個本身的命名空間,叫作global namespace
,它記錄了module
的變量,包括 functions, classes
和其它imported modules
,還有 module
級別的 變量和常量。build-in
命名空間,能夠被任意模塊訪問,這個build-in
命名空間中包含了build-in function
和 exceptions
。當python
中的某段代碼要訪問一個變量x
時,python
會在全部的命名空間中尋找這個變量,查找的順序爲:閉包
namespace
中都找不到變量x
,python
會假設x
是build-in
的函數或者變量。若是x
不是內置函數或者變量,python
會報錯NameError
。對於閉包來講,這裏有一點區別,若是在local namespace中找不到變量的話,還會去父函數的local namespace中找變量。函數
內置函數locals()
, 返回當前函數(方法)的局部命名空間ui
def func(a = 1): b = 2 print(locals()) return a+b func() # {'a': 1, 'b': 2} 能夠看出,locals返回的是個dict
內置函數globals()
,返回當前module
的命名空間spa
def func(a = 1): b = 2 return a+b func() print(globals()) # globals()返回的也是個dict
locals()和globals()有一個區別是,locals只讀,globals能夠寫code
def func(a = 1): b = 2 return a+b func() glos = globals() glos['new_variable'] = 3 print(new_variable) # 3 , 咱們並無顯示定義new_variable這個變量,只是在globals中添加了這個key,在隨後的代碼中, #就能夠像訪問通常變量同樣來訪問。 def func(a = 1): b = 2 locs = locals() locs['c'] = 1 print(c) func() # NameError: name 'c' is not defined
import module
時,module
自己被引入,可是保存它原有的命名空間,因此咱們須要使用module.name
這種方式訪問它的 函數和變量。from module import
這種方式,是將其它模塊的函數或者變量引到當前的命名空間中,因此就不須要使用module.name
這種方式訪問其它的模塊的方法了。python
中的module
也是對象,全部的modules
都有一個內置的屬性__name__
,模塊的__name__
屬性的值取決於如何使用這個模塊,若是import module
,那麼__name__
屬性的值是模塊的名字。若是直接執行這個模塊的話,那麼__name__
屬性的值就是默認值__main__
。對象