Python兩個(gè)內(nèi)置函數(shù) locals 和globals(學(xué)習(xí)筆記)
Python兩個(gè)內(nèi)置函數(shù)——locals 和globals
這兩個(gè)函數(shù)主要提供,基于字典的訪問(wèn)局部和全局變量的方式。
在理解這兩個(gè)函數(shù)時(shí),首先來(lái)理解一下python中的名字空間概念。Python使用叫做名字空間的東西來(lái)記錄變量的軌跡。名字空間只是一個(gè)字典,它的鍵字就是變量名,字典的值就是那些變量的值。實(shí)際上,名字空間可以象Python的字典一樣進(jìn)行訪問(wèn)
每個(gè)函數(shù)都有著自已的名字空間,叫做局部名字空間,它記錄了函數(shù)的變量,包括函數(shù)的參數(shù)和局部定義的變量。每個(gè)模塊擁有它自已的名字空間,叫做全局名字空間,它記錄了模塊的變量,包括函數(shù)、類(lèi)、其它導(dǎo)入的模塊、模塊級(jí)的變量和常量。還有就是內(nèi)置名字空間,任何模
塊均可訪問(wèn)它,它存放著內(nèi)置的函數(shù)和異常。
當(dāng)一行代碼要使用變量 x 的值時(shí),Python會(huì)到所有可用的名字空間去查找變量,按照如下順序:
1.局部名字空間 - 特指當(dāng)前函數(shù)或類(lèi)的方法。如果函數(shù)定義了一個(gè)局部變量 x,Python將使用這個(gè)變量,然后停止搜索。
2.全局名字空間 - 特指當(dāng)前的模塊。如果模塊定義了一個(gè)名為 x 的變量,函數(shù)或類(lèi),Python 將使用這個(gè)變量然后停止搜索。
3.內(nèi)置名字空間 - 對(duì)每個(gè)模塊都是全局的。作為最后的嘗試,Python將假設(shè) x 是內(nèi)置函數(shù)或變量。
如果Python在這些名字空間找不到 x,它將放棄查找并引發(fā)一個(gè) NameError 的異常,同時(shí)傳遞
There is no variable named 'x' 這樣一條信息。
象Python中的許多事情一樣,名字空間在運(yùn)行時(shí)直接可以訪問(wèn)。特別地,局部名字空間可以通過(guò)內(nèi)置的 locals 函數(shù)來(lái)訪問(wèn)。全局(模塊級(jí)別)名字空間可以通過(guò) globals 函數(shù)來(lái)訪問(wèn)
locals 介紹
>>> def test(arg): #函數(shù) foo 在它的局部名字空間中有兩個(gè)變量:arg(它的值被傳入函數(shù)),和 z(它是在函數(shù)里定義的)。 z = 1 print locals() >>> test(4) #locals 返回一個(gè)名字/值對(duì)的字典。這個(gè)字典的鍵字是字符串形式的變量名字,字典的值是變量的實(shí)際值。 #所以用 4 來(lái)調(diào)用 foo,會(huì)打印出包含函數(shù)兩個(gè)局部變量的字典:arg (4) 和 z (1)。 {'z': 1, 'arg': 4} >>> test('doulaixuexi') #locals 可以用于所有類(lèi)型的變量。 {'z': 1, 'arg': 'doulaixuexi'} >>>
globals 介紹
>>> 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
由此可見(jiàn),發(fā)現(xiàn)globals 函數(shù)返回一個(gè)全局變量的字典,包括所有導(dǎo)入的變量。
#局部變量函數(shù)locals例子(locals 返回一個(gè)名字/值對(duì)的字典。):
def foo(arg, a): x = 1 y = 'xxxxxx' for i in range(10): j = 1 k = i print locals() #調(diào)用函數(shù)的打印結(jié)果 foo(1,2) #{'a': 2, 'i': 9, 'k': 9, 'j': 1, 'arg': 1, 'y': 'xxxxxx', 'x': 1}
from module import 和 import module之間的不同。使用 import module,模塊自身被導(dǎo)入,
但是它保持著自已的名字空間,這就是為什么你需要使用模塊名來(lái)訪問(wèn)它的函數(shù)或?qū)傩裕╩odule.function)
的原因。但是使用 from module import,實(shí)際上是從另一個(gè)模塊中將指定的函數(shù)和屬性導(dǎo)入到你自己的名字
空間,這就是為什么你可以直接訪問(wèn)它們卻不需要引用它們所來(lái)源的模塊的原因。
locals 是只讀的,globals 不是
相關(guān)文章
Python爬取當(dāng)網(wǎng)書(shū)籍?dāng)?shù)據(jù)并數(shù)據(jù)可視化展示
這篇文章主要介紹了Python爬取當(dāng)網(wǎng)書(shū)籍?dāng)?shù)據(jù)并數(shù)據(jù)可視化展示,下面文章圍繞Python爬蟲(chóng)的相關(guān)資料展開(kāi)對(duì)爬取當(dāng)網(wǎng)書(shū)籍?dāng)?shù)據(jù)的詳細(xì)介紹,需要的小伙伴可以參考一下,希望對(duì)你有所幫助2022-01-01Python實(shí)現(xiàn)操縱控制windows注冊(cè)表的方法分析
這篇文章主要介紹了Python實(shí)現(xiàn)操縱控制windows注冊(cè)表的方法,結(jié)合實(shí)例形式分析了Python使用_winreg模塊以及win32api模塊針對(duì)Windows注冊(cè)表操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-05-05python 3.74 運(yùn)行import numpy as np 報(bào)錯(cuò)lib\site-packages\numpy\_
這篇文章主要介紹了python 3.74 運(yùn)行import numpy as np 報(bào)錯(cuò)lib\site-packages\numpy\__init__.py,原來(lái)需要更新一下numpy即可2019-10-10Jupyter Lab無(wú)法打開(kāi)終端窗口的解決方法
本文主要介紹了Jupyter Lab無(wú)法打開(kāi)終端窗口的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02對(duì)Python強(qiáng)大的可變參數(shù)傳遞機(jī)制詳解
今天小編就為大家分享一篇對(duì)Python強(qiáng)大的可變參數(shù)傳遞機(jī)制詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06對(duì)numpy中的transpose和swapaxes函數(shù)詳解
今天小編就為大家分享一篇對(duì)numpy中的transpose和swapaxes函數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Python 調(diào)用C++封裝的進(jìn)一步探索交流
這篇文章主要介紹了Python 調(diào)用C++封裝的進(jìn)一步探索交流,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03Python中3種內(nèi)建數(shù)據(jù)結(jié)構(gòu):列表、元組和字典
這篇文章主要介紹了Python中3種內(nèi)建數(shù)據(jù)結(jié)構(gòu):列表、元組和字典,需要的朋友可以參考下2014-11-11