[英]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.