python 命名空間

python使用命名空間記錄變量。python中的命名空間就像是一個dictkey是變量的名字,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會在全部的命名空間中尋找這個變量,查找的順序爲:閉包

  • local namespace - 指的是當前函數或者當前類方法。若是在當前函數中找到了變量,中止搜索
  • global namespace - 指的是當前的模塊。若是在當前模塊中找到了變量,中止搜索
  • build-in namespace - 若是在以前兩個namespace中都找不到變量xpython會假設xbuild-in的函數或者變量。若是x不是內置函數或者變量,python會報錯NameError

對於閉包來講,這裏有一點區別,若是在local namespace中找不到變量的話,還會去父函數的local namespace中找變量。函數

locals

內置函數locals(), 返回當前函數(方法)的局部命名空間ui

def func(a = 1): b = 2 print(locals()) return a+b func() # {'a': 1, 'b': 2} 能夠看出,locals返回的是個dict

 

globals

內置函數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

from module import 和 import module

  • 使用import module時,module自己被引入,可是保存它原有的命名空間,因此咱們須要使用module.name這種方式訪問它的 函數和變量。
  • from module import這種方式,是將其它模塊的函數或者變量引到當前的命名空間中,因此就不須要使用module.name這種方式訪問其它的模塊的方法了。

if __name__ trick

python中的module也是對象,全部的modules都有一個內置的屬性__name__,模塊的__name__屬性的值取決於如何使用這個模塊,若是import module,那麼__name__屬性的值是模塊的名字。若是直接執行這個模塊的話,那麼__name__屬性的值就是默認值__main__對象

module的一些內置屬性

  • __name__: 上面已經介紹過
  • __file__ : 當前module的絕對路徑
  • __dict__:
  • __doc__ :
  • __package__:
  • __path__:
相關文章
相關標籤/搜索