Python的locals()做什么?

时间:2016-11-25 00:49:31

标签: python

Python的locals()文档说:

  

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

  1. 当前的本地符号表中究竟有哪些内容?

  2. 如果在函数的最开始调用locals(),本地符号表是否保证与参数dict相同?

    例如,如果我们有以下程序:

    def foo(x, y):
        print(locals() == {'x': 1, 'y': 2})
    foo(1, 2)
    

    无论我们使用什么平台和Python实现,它总是输出True吗?

1 个答案:

答案 0 :(得分:0)

  

当前的本地符号表中究竟有哪些内容?

嗯,你可以自己看看。在你的Python程序非常激动人心的情况下,locals()返回的符号表如下所示:

print(locals())

哪个输出:

{'__doc__': None, '__spec__': None, '__package__': None, '__builtins__': 
<module 'builtins' (built-in)>, '__name__': '__main__', '__loader__': 
<class '_frozen_importlib.BuiltinImporter'>, 
'__file__': 'C:\\Users\\$Name$\\Desktop\\script.py'}

符号表包含一些&#34;魔术变量&#34;,以及有关当前Python文件的一些信息。例如__file__键,其中包含当前源文件的名称。 locals返回的内容几乎与符号表的定义匹配:

  

在计算机科学中,符号表是语言翻译器(如编译器或解释器)使用的数据结构,其中程序源代码中的每个标识符与其声明或在源头出现。 - Wikipedia: Symbol table

(强调我的)

  

如果在函数的最开头调用了locals(),本地符号表是否保证与参数dict相同?

答案 1 。函数有自己的范围。而且,正如名称所示,locals()仅返回当前范围的本地标识符。因此,函数内部的locals()调用无法通过程序的外部范围进行更改。例如

>>> var = 10 # global variable
>>> locals()['var'] # var is accessible in the current scope
10
>>> def func():
    print(locals()['var']) # but not in this scope. Python will raise an error


>>> func()
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    func()
  File "<pyshell#16>", line 2, in func
    print(locals()['var'])
KeyError: 'var'
>>> 

1 <子> 有点难以完全理解你在第二个问题中提出的问题,所以如果我的答案没有关系,我会道歉。但是我相信你的问:如果我在我的函数开头调用locals(),在我的定义中,当地人返回的dict()保证保持不变吗?。如果情况并非如此,请更新您的问题,然后我会尝试重新回答。