Rig*_*leg 8 python namespaces symbol-table
模块保存字典以跟踪其上下文,例如在执行的某个点定义的名称.这本词典可以通过访问vars(module)(或module.__dict__)如果module是进口,或者通过向呼叫locals模块本身的内置功能:
更新并返回表示当前本地符号表的字典.
但是当我尝试从函数中访问locals字典时,我发现自己有点困惑.仅包含以下内容的脚本的输出是空字典:
def list_locals():
print(locals())
list_locals()
Run Code Online (Sandbox Code Playgroud)
但另一方面,如果脚本仅包含以下内容,则输出是包含的预期字典__name__,__doc__以及其他模块级变量:
print(locals())
Run Code Online (Sandbox Code Playgroud)
那么,本地词典的内容何时设置?另外,"更新"在locals函数定义中意味着什么?
模块的名称空间是通过访问的全局名称空间globals().没有单独的locals命名空间,因此locals(),在函数之外,只返回全局命名空间.
只有函数具有本地名称空间.请注意,这locals()是该命名空间的单向反映; 函数的CPython实现是高度优化的,您不能通过locals()字典添加或更改局部变量.locals()每当命名空间在对该函数的调用之间发生更改时,返回的字典都会更新.
另请注意,list/dict/set comprehensions,生成器表达式和类主体之类的东西实际上也是作为函数执行的,尽管具有不同的命名空间规则.在这种情况下,locals()还将返回单独的函数本地命名空间.