[英]difference between locals() and globals() and dir() in python
假設這段代碼:
>>> iterator=filter(lambda x: x % 3 == 0, [2, 18, 9, 22, 17, 24, 8, 12, 27])
>>> x=int()
>>> locals()
{'__package__': None, '__spec__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__name__': '__main__', '__builtins__': <module 'builtins' (built-in)>, 'iterator': <filter object at 0x02E732B0>, 'x': 0, '__doc__': None}
>>> globals()
{'__package__': None, '__spec__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__name__': '__main__', '__builtins__': <module 'builtins' (built-in)>, 'iterator': <filter object at 0x02E732B0>, 'x': 0, '__doc__': None}
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'iterator', 'x']
>>>
locals,globals和dir有什么區別? 什么是用法?
在全局范圍內, locals()
和globals()
將相同的字典返回到全局命名空間。 但是在函數內部, locals()
將副本返回到本地名稱空間,而globals()
將返回全局名稱空間(包含全局名稱)。 所以它們之間的區別僅在函數中可見。 舉例說明 -
>>> locals() == globals() #global scope, that is directly within the script (not inside a function.
True
>>> def a():
... l = 1
... print('locals() :',locals())
... print('globals() :',globals())
...
>>> a()
locals() : {'l': 1}
globals() : {'BOTTOM': 'bottom', 'PROJECTING': 'proj....
從globals()
文檔 -
全局()
返回表示當前全局符號表的字典。 這始終是當前模塊的字典(在函數或方法內部,這是定義它的模塊,而不是調用它的模塊)。
當地人()
更新並返回表示當前本地符號表的字典。 locals()在函數塊中調用時返回自由變量,但在類塊中不調用。
注意:不應修改此詞典的內容; 更改可能不會影響解釋器使用的本地和自由變量的值。
要回答有關使用的問題,一種用法是能夠使用字符串來訪問變量/名稱。 例如,如果你有一個名為a
的變量,並且你想使用字符串 - 'a'
訪問它的值,你可以使用globals()
或locals()
作為 - globals()['a']
,這樣就可以了回到你的全局變量的值, a
或locals()['a']
會返回你的價值a
在當前命名空間(這是全局命名空間時,直接在腳本中,或局部名字空間,如果一個函數內)
dir()
顯示作為參數傳入的對象的屬性列表,沒有參數,它返回當前本地命名空間中的名稱列表(類似於locals()。keys())。 從dir()
文檔 -
DIR([對象])
如果沒有參數,則返回當前本地范圍中的名稱列表。 使用參數,嘗試返回該對象的有效屬性列表。
如果您嘗試在函數內執行它們,您可以注意到locals
和globals
之間的區別。 如果您嘗試從控制台運行它們而不創建嵌套作用域,那么顯而易見的結果是您將無法發現任何差異。
locals
返回一個在本地范圍內聲明的變量字典: https : //docs.python.org/2/library/functions.html#locals globals
返回一個在全局范圍內聲明的變量字典: https : //docs.python.org/2/library/functions.html#globals dir
工作方式與locals
類似,但是如果你將一個對象作為參數傳遞,那么它會返回該對象的有效屬性列表: https : //docs.python.org/2 /library/functions.html#dir 在全局范圍內(例如在交互式提示符下),您的locals
和globals
是相同的。 但是,在函數內部,它們是不同的:
x = 'some'
y = 'this'
def foo(x):
y = 'that'
print "My locals: ", `locals()`
print "My globals: ", `globals()`
# locals has x: other and y: that only
# globals contains x: some, y: this and many more global names
foo('other')
值為'some'的全局變量x
是與局部變量x
不同的變量,其值為'other'(對於名為y
的兩個變量,它們是相同的)。
有關詳細信息,請查看builtins文檔 ,或有關Python范圍規則的文檔。
沒有參數的dir()
與locals().keys()
基本相同( 文檔說 : 沒有參數,返回當前本地范圍內的名稱列表。 )
globals()
在帶有(key, value)
-pairs的dict
-object中返回當前全局命名空間中的符號(當前模塊的范圍+內置(key, value)
。 key
是一個帶有符號名稱的字符串, value
是符號本身的值(例如數字1
,另一個dict
,函數,類等)
locals()
返回當前本地命名空間中的符號(函數范圍)。 在模塊級別調用時,這將給出與globals()
相同的結果。
dir()
(不帶參數)返回當前本地名稱空間中的名稱列表。
在模塊級別上運行以下三個命令時,它們具有相同的值:
>>> sorted(locals().keys())
['A', '__builtins__', '__doc__', '__name__', '__package__', 'a', 'loc']
>>> sorted(dir())
['A', '__builtins__', '__doc__', '__name__', '__package__', 'a', 'loc']
>>> sorted(globals().keys())
['A', '__builtins__', '__doc__', '__name__', '__package__', 'a', 'loc']
如果這三個調用是函數locals().keys()
和dir()
具有相同的值,但globals()
不同。
>>> def A():
... print(sorted(locals().keys()))
... print(sorted(dir()))
... print(sorted(globals().keys()))
>>> A()
[]
[]
['A', 'B', '__builtins__', '__doc__', '__name__', '__package__', 'a', 'loc']
你可以看到使用globals()
和locals()
。
dir()
是,它接受一個對象作為參數。 它將返回該對象的屬性名稱列表。 您可以使用它來例如在運行時檢查對象。
如果我們用上面的例子用函數A()
,我們可以調用:
>>> dir(A)
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']
並獲取函數對象A
所有屬性。
有關dir()
更多詳細信息: Python中的dir(...)和vars(...).keys()之間的區別?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.