python locals globals

Python有兩個內置的函數,locals() 和globals(),它們提供了基於字典的訪問局部和全局變量的方式。 git

首先,是關於名字空間的一個名詞解釋。是枯燥,可是很重要,因此要耐心些。Python使用叫作名字空間的東西來記錄變量的軌跡。名字空間只是一個 字典,它的鍵字就是變量名,字典的值就是那些變量的值。實際上,名字空間能夠象Python的字典同樣進行訪問,一會咱們就會看到。 函數

在一個Python程序中的任何一個地方,都存在幾個可用的名字空間。每一個函數都有着自已的名字空間,叫作局部名字空間,它記錄了函數的變量,包括 函數的參數和局部定義的變量。每一個模塊擁有它自已的名字空間,叫作全局名字空間,它記錄了模塊的變量,包括函數、類、其它導入的模塊、模塊級的變量和常 量。還有就是內置名字空間,任何模塊都可訪問它,它存放着內置的函數和異常。 ui

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

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

若是Python在這些名字空間找不到 x,它將放棄查找並引起一個 NameError 的異常,同時傳 遞 There is no variable named 'x' 這樣一條信息 code

象Python中的許多事情同樣,名字空間在運行時直接能夠訪問。特別地,局部名字空間能夠經過內置的 locals 函數來訪問。全局(模塊級別)名字空間能夠經過 globals 函數來訪問 ci

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 介紹 rpc

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 函數返回一個全局變量的字典,包括全部導入的變量。 get



from module import 和 import module之間的不一樣。使用 import module,模塊自身被導入,
可是它保持着自已的名字空間,這就是爲何你須要使用模塊名來訪問它的函數或屬(module.function)
的緣由。可是使用 from module import,其實是從另外一個模塊中將指定的函數和屬性導入到你本身的名字空間,這就是爲何你能夠直接訪問它們卻不須要引用它們所來源的模塊的緣由。
it

相關文章
相關標籤/搜索