python中locals()和globals()与dir()之间的区别

时间:2015-08-14 06:19:07

标签: 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有什么区别?什么是用法?

4 个答案:

答案 0 :(得分:9)

在全局范围内,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....

来自documentation of globals() -

  

<强>全局()

     

返回表示当前全局符号表的字典。这始终是当前模块的字典(在函数或方法内部,这是定义它的模块,而不是调用它的模块)。

来自documentation of locals() -

  

<强>当地人()

     

更新并返回表示当前本地符号表的字典。当在函数块中调用时,locals()返回自由变量,但不在类块中调用。

     

注意:不应修改此词典的内容;更改可能不会影响解释器使用的本地和自由变量的值。

要回答有关用法的问题,一种用法是能够使用字符串来访问变量/名称。例如,如果您有一个名为a的变量,并且想要使用字符串'a'来访问其值,则可以使用globals()locals()作为 - { {1}},这将返回全局变量globals()['a']的值,或a将返回当前命名空间中的locals()['a']的值(当直接在脚本内部时,它是全局命名空间,如果在函数内部,则为本地命名空间)

a显示作为参数传入的对象的属性列表,没有参数,它返回当前本地命名空间中的名称列表(类似于locals()。keys())。来自documentation of dir() -

  

<强> DIR([对象])

     

不带参数,返回当前本地范围内的名称列表。使用参数,尝试返回该对象的有效属性列表。

答案 1 :(得分:8)

如果您尝试在函数内执行它们,您可以注意到localsglobals之间的区别。如果您尝试从控制台运行它们而不创建嵌套范围,那么显而易见的结果是您将无法发现任何差异。

答案 2 :(得分:0)

在全球范围内(例如在互动提示下),您的localsglobals是相同的。但是,在函数内部,它们是不同的:

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')

全局变量x,其值为&#39; some&#39;是与局部变量x不同的变量,其值为&#39;其他&#39; (对于名为y的两个变量,也是如此。

检查the builtins documentation以获取详细信息,或查看有关Python范围规则的文档。

没有参数的dir()locals().keys()基本相同(documentation says不带参数,返回当前本地范围内的名称列表。

答案 3 :(得分:0)

globals()dict - 具有(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()呢?

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()的更多详情,请访问:Difference between dir(…) and vars(…).keys() in Python?