【python】locals()、globals()與名字空間

名字空間

Python使用叫做名字空間的東西來記錄變量的軌跡。名字空間只是一個字典,它的鍵字就是變量名,字典的值就是那些變量的值。實際上,名字空間可以象Python的字典一樣進行訪問。
在一個Python程序中的任何一個地方,都存在幾個可用的名字空間。每個函數都有着自己的名字空間,叫做局部名字空間,它記錄了函數的變量,包括函數的參數和局部定義的變量。每個模塊擁有它自己的名字空間,叫做全局名字空間,它記錄了模塊的變量,包括函數、類、其它導入的模塊、模塊級的變量和常量。還有就是內置名字空間,任何模塊均可訪問它,它存放着內置的函數和異常。

當一行代碼要使用變量 x 的值時,Python會到所有可用的名字空間去查找變量,按照如下順序:

1.局部名字空間 - 特指當前函數或類的方法。如果函數定義了一個局部變量x,Python將使用這個變量,然後停止搜索。
2. 全局名字空間 - 特指當前的模塊。如果模塊定義了一個名爲x的變量,函數或類,Python將使用這個變量然後停止搜索。
3. 內置名字空間 - 對每個模塊都是全局的。作爲最後的嘗試,Python將假設x是內置函數或變量。

locals和globals的區別

locals()是隻讀的。globals()不是。這裏說的只讀,是值對於原有變量的只讀。其實還可以對locals()賦值的。
注意,locals()返回的是當前所在最小命名空間的局部變量的一個拷貝。比如說在一個函數中調用locals(),那麼返回的將是這個函數內部的局部變量。記住,locals返回的變量都是原有變量的“拷貝”。

from module importimport module之間的不同。使用import module,模塊自身被導入,但是它保持着自已的名字空間,這就是爲什麼你需要使用模塊名來訪問它的函數或屬性(module.function)的原因。但是使用 from module import,實際上是從另一個模塊中將指定的函數和屬性導入到你自己的名字空間,這就是爲什麼你可以直接訪問它們卻不需要引用它們所來源的模塊的原因。

使用locals()的例子

在類的編寫中,__init__方法中常常有類似self.something = something的累贅代碼,我們可以用locals()方法來自動初始化實例變量。
原先的代碼是這樣的:

def __init__(self, foo, bar, baz, boom=1, bang=2):
    self.foo = foo
    self.bar = bar
    self.baz = baz
    self.boom = boom
    self.bang = bang

下面是修改之後的代碼:

# 定義抽取屬性的輔助函數
def attributesFromDict(d):
    self = d.pop('self')
    for n, v in d.iteritems():
        setattr(self, n, v)

# __init__被縮減爲一行
def __init__(self, foo, bar, baz, boom=1, bang=2):
    attributesFromDict(locals())

轉載請註明作者Jason Ding及其出處
Github博客主頁(http://jasonding1354.github.io/)
GitCafe博客主頁(http://jasonding1354.gitcafe.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
簡書主頁(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)
Google搜索jasonding1354進入我的博客主頁

發佈了185 篇原創文章 · 獲贊 86 · 訪問量 94萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章