Python有兩個內建的函數,locals() 和globals(),它們提供了基於字典的訪問局部和全域變數的方式。
首先,是關於名字空間的一個名詞解釋。是枯燥,但是很重要,所以要耐心些。Python使用叫做名字空間的東西來記錄變數的軌跡。名字空間只是一個 字典,它的鍵字就是變數名,字典的值就是那些變數的值。實際上,名字空間可以象Python的字典一樣進行訪問,一會我們就會看到。
在一個Python程式中的任何一個地方,都存在幾個可用的名字空間。每個函數都有著自已的名字空間,叫做局部名字空間,它記錄了函數的變數,包括 函數的參數和局部定義的變數。每個模組擁有它自已的名字空間,叫做全域名字空間,它記錄了模組的變數,包括函數、類、其它匯入的模組、模組層級的變數和常 量。還有就是內建名字空間,任何模組均可訪問它,它存放著內建的函數和異常。
當一行代碼要使用變數 x 的值時,Python會到所有可用的名字空間去尋找變數,按照如下順序:
- 局部名字空間 - 特指當前函數或類的方法。如果函數定義了一個局部變數 x,Python將使用這個變數,然後停止搜尋。
- 全域名字空間 - 特指當前的模組。如果模組定義了一個名為 x 的變數,函數或類,Python將使用這個變數然後停止搜尋。
- 內建名字空間 - 對每個模組都是全域的。作為最後的嘗試,Python將假設 x 是內建函數或變數。
如果Python在這些名字空間找不到 x,它將放棄尋找並引發一個 NameError 的異常,同時傳 遞 There is no variable named 'x' 這樣一條資訊
象Python中的許多事情一樣,名字空間在運行時直接可以訪問。特別地,局部名字空間可以通過內建的 locals 函數來訪問。全域(模組層級別)名字空間可以通過 globals 函數來訪問
locals 介紹
1
2
3
4
5
6
7
8
9
10
11
12
|
>>> def test(arg): #函數 foo 在它的局部名字空間中有兩個變數:arg(它的值被傳入函數),和 z(它是在函數裡定義的)。
z = 1
print locals() >>> test(4) #locals 返回一個名字/值對的字典。這個字典的鍵字是字串形式的變數名字,字典的值是變數的實際值。 #所以用 4 來調用 foo,會列印出包含函數兩個局部變數的字典:arg (4) 和 z (1)。 {'z': 1, 'arg': 4} >>> test('doulaixuexi') #locals 可以用於所有類型的變數。 {'z': 1, 'arg': 'doulaixuexi'} >>> |
globals 介紹
1
2
3
4
5
6
7
8
9
10
11
12
|
>>> from sys import * >>> print globals() {'setrecursionlimit': <built-in function setrecursionlimit>, 'dont_write_bytecode': False, 'getfilesystemencoding': <built-in function getfilesystemencoding>, 'long_info': sys.long_info(bits_per_digit=15, sizeof_digit=2), 'stdout': <idlelib.rpc.RPCProxy object at 0x02110850>, 'text': <function text at 0x02111A70>, 'meta_path': [], 'exc_clear': <built-in function exc_clear>, 'prefix': 'C:\\Python27', 'getrefcount': <built-in function getrefcount
......省略很多 |
可以發現globals 函數返回一個全域變數的字典,包括所有匯入的變數。