【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 import
和import 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進入我的部落格主頁
相關文章
- Python 內建函式:——locals 和 globals介紹Python函式
- Python 兩個內建函式: locals() 和 globals()Python函式
- aardio教程四) 理解名字空間(namespace)namespace
- LWN 文章翻譯 - 名字空間實作系列
- C和C++中的名字空間和作用域C++
- Python函式——locals()解包傳參Python函式
- python名稱空間Python
- .NET C#基礎(6):名稱空間 - 有名字的作用域C#
- GOPATH 與工作空間Go
- Python名稱空間包Python
- 1.2 GOPATH 與工作空間Go
- 命令空間(namespace)===> 用於防止名字衝突而引入的一種機制namespace
- 時間與空間複雜度分析複雜度
- 冰與火之歌:「時間」與「空間」複雜度複雜度
- 函式呼叫與空間分配函式
- Python作用域和名稱空間Python
- Python - 使用__slots__節省空間Python
- MySQL 中的共享表空間與獨立表空間如何選擇MySql
- Python與開源GIS:資料處理、空間分析與地圖製圖教程Python地圖
- 時間複雜度與空間複雜度時間複雜度
- Python中名稱空間是什麼?名稱空間生命週期是多久?Python
- Python中名稱空間包簡介Python
- 為什麼問題空間與解決方案空間如此重要? - Nikhil Gupta
- 16、表空間 建立表空間
- express res.locals app.locals app.set render.opts原始碼分析ExpressAPP原始碼
- [20180423]表空間閃回與snapshot standby
- Python3 名稱空間和作用域Python
- 『OpenCV-Python』色彩空間及色彩轉換OpenCVPython
- 深入講解Python名稱空間規則!Python
- MySQL空間最佳化(空間清理)MySql
- 【Python】下載百度空間文章的python原始碼Python原始碼
- 解決Ubuntu虛擬機器佔用空間與實際空間不符問題Ubuntu虛擬機
- UNDO表空間空間回收及切換
- 掌握時間與空間:深入探討Golang中的時間戳與時區轉換Golang時間戳
- 驅動篇——核心空間與核心模組
- [20210527]rman與undo表空間備份.txt
- 當使用者無限制使用表空間配額且表空間有足夠空間時出現超出表空間的空間限額
- 突然間給未來的孩子起了個名字
- 世界空間到觀察空間的矩陣矩陣