Python的locals()
文档说:
更新并返回表示当前本地符号表的字典。
locals()
在函数块中调用时会返回自由变量,但不会在类块中调用。
当前的本地符号表中究竟有哪些内容?
如果在函数的最开始调用locals()
,本地符号表是否保证与参数dict相同?
例如,如果我们有以下程序:
def foo(x, y):
print(locals() == {'x': 1, 'y': 2})
foo(1, 2)
无论我们使用什么平台和Python实现,它总是输出True
吗?
答案 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()
保证保持不变吗?。如果情况并非如此,请更新您的问题,然后我会尝试重新回答。