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

python中locals()与globals()和dir()之间的区别,python,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__

假设此代码:

>>> 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']
>>> 
迭代器=过滤器(lambda x:x%3==0,[2,18,9,22,17,24,8,12,27]) >>>x=int() >>>本地人() {uuuu包:无,''uuu规范:无,''uuu加载器:无,''uuu名称:无,''uuuuu主文件:无,''uuuu内置文件:无,'x','uuuu文档:无} >>>globals() {uuuu包:无,''uuu规范:无,''uuu加载器:无,''uuu名称:无,''uuuuu主文件:无,''uuuu内置文件:无,'x','uuuu文档:无} >>>目录() [“内置”、“文档”、“加载程序”、“名称”、“包”、“规范”、“迭代器”、“x”] >>>
本地、全局和dir之间有什么区别?用法是什么?

如果您尝试在函数中执行它们,您可以注意到
局部
全局
之间的区别。如果您试图从控制台运行它们而不创建嵌套的作用域,那么明显的结果是您将无法注意到任何差异

  • locals
    返回在本地范围内声明的变量字典:
  • globals
    返回在全局范围内声明的变量字典:
  • dir
    的工作方式与
    locals
    类似,如果您不提供参数,但如果您将对象作为参数传递,则它会返回该对象的有效属性列表:

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

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

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

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

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

dir([object])

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

在全局范围内(例如在交互式提示下),您的
局部变量
全局变量
是相同的。但是,在函数内部,它们是不同的:

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
与值为“other”的局部变量
x
是不同的变量(名为
y
的两个变量也是相同的)

查看有关Python范围规则的详细信息或文档

不带参数的
dir()
locals().keys()
(不带参数,返回当前本地范围内的名称列表。)

globals()
返回
dict
-对象中当前全局命名空间(当前模块+内置范围)中的符号(键,值)-成对。
是一个带有符号名称的字符串,
是符号本身的值(例如数字
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()
at:

一些相关问题:和+1关于最后一点:len(locals())==len(dir()),在全局范围或解释器中,它也等于len(globals())。(旁注,如果使用ipython解释器,请注意它会不断添加/保存局部变量。)