1、局部命名空間可以locals()BIF來訪問。
locals返回一個名字/值對的dictionary。這個dictionary的鍵是字符串形式的變量名字,dictionary的值是變量的實際值。
示例:
deffunc1(i,str):
x=12345
print(locals())
func1(1,"first")
輸出:{'str':'first','x':12345,'i':1}
2、全局(模塊級別)命名空間可以通過globals()BIF來訪問。
示例:
'''Createdon2013-5-26'''
importcopy
fromcopyimportdeepcopy
gstr="globalstring"
deffunc1(i,info):
x=12345
print(locals())
func1(1,"first")
if__name__=="__main__":
print("thecurrentscope'sglobalvariables:")
dictionary=globals()
print(dictionary)
輸出:(我自己給人為的換行、更換了順序,加顏色的語句下面重點說明)
{
'__name__':'__main__',
'__doc__':'Createdon2013-5-26',
'__package__':None,
'__cached__':None,
'__file__':'E:\\WorkspaceP\\Test1\\src\\base\\test1.py',
'__loader__':<_frozen_importlib.SourceFileLoaderobjectat0x01C702D0>,
'copy':,
'__builtins__':,
'gstr':'globalstring',
'dictionary':{...},
'func1':,
'deepcopy':
}
總結(jié)
1、模塊的名字空間不僅僅包含模塊級的變量和常量,還包括所有在模塊中定義的函數(shù)和類。除此以外,它還包括了任何被導(dǎo)入到模塊中的東西。
2、我們看到,內(nèi)置命名也同樣被包含在一個模塊中,它被稱作__builtin__。
3、回想一下frommoduleimport和importmodule之間的不同。
使用importmodule,模塊自身被導(dǎo)入,但是它保持著自已的名字空間,這就是為什么您需要使用模塊名來訪問它的函數(shù)或?qū)傩裕簃odule.function的原因。
但是使用frommoduleimportfunction,實際上是從另一個模塊中將指定的函數(shù)和屬性導(dǎo)入到您自己的名字空間,這就是為什么您可以直接訪問它們卻不需要引用它們所來源的模塊。使用globals函數(shù),您會真切地看到這一切的發(fā)生,見上面的紅色輸出語句。
3、locals與globals之間的一個重要的區(qū)別
locals是只讀的,globals不是
示例:
deffunc1(i,info):
x=12345
print(locals())
locals()["x"]=6789
print("x=",x)
y=54321
func1(1,"first")
globals()["y"]=9876
print("y=",y)
輸出:
{'i':1,'x':12345,'info':'first'}
x=12345
y=9876
解釋:
locals實際上沒有返回局部名字空間,它返回的是一個拷貝。所以對它進行改變對局部名字空間中的變量值并無影響。
globals返回實際的全局名字空間,而不是一個拷貝。所以對globals所返回的dictionary的任何的改動都會直接影響到全局變量。
以上內(nèi)容為大家介紹了Python命名空間的訪問,希望對大家有所幫助,如果想要了解更多Python相關(guān)知識,請關(guān)注IT培訓(xùn)機構(gòu):千鋒教育。