python - locals 字典是什么时候设置的?

标签 python namespaces symbol-table

一个模块拥有一个字典来跟踪它的上下文,例如在执行的某个点定义的名称。这本词典可以通过vars(module)访问。 (或 module.__dict__)如果 module 被导入,或通过调用 locals模块本身的内置函数:

Update and return a dictionary representing the current local symbol table.

但是当我尝试从一个函数访问本地字典时,我发现自己有点困惑。仅包含以下内容的脚本的输出是一个空字典:

def list_locals():
    print(locals())

list_locals()

但另一方面,如果脚本仅包含以下内容,则输出是预期的字典,包含 __name____doc__ 和其他模块级变量:

print(locals())

那么,locals字典的内容是什么时候设置的呢? 另外,locals函数定义中的“update”是什么意思?

最佳答案

模块的命名空间是全局 命名空间,通过globals() 访问。 .没有单独的 locals 命名空间,因此 locals() 在函数之外仅返回全局命名空间。

只有函数才有本地命名空间。请注意,locals() 是该命名空间的一种单向反射(reflect);函数的 CPython 实现是高度优化的,您不能通过 locals() 字典添加或更改局部变量。每当命名空间在对该函数的调用之间发生变化时,locals() 返回的字典就会更新。

另请注意,列表/字典/集合理解、生成器表达式和类主体等内容实际上也作为函数执行,尽管具有不同的命名空间规则。在这种情况下,locals() 也将返回单独的函数本地命名空间。

关于python - locals 字典是什么时候设置的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46095903/

相关文章:

python - 将值附加到python中的两个关键defaultdict

python - 无法加载 Subversion python 绑定(bind)

python - 无法在 Mojave 中升级 Python

c++ - 如何使用命名空间中定义的运算符?

perl - 符号表:删除条目

c - GDB - 如何处理 "No Symbol Table"

python - 如何使用单应性将图像投影到另一图像上

class - 在 Fortran 中将模块分解为多个文件

python - 我可以为变量添加第二个名字吗

c++ - (.eh) 在 nm 输出中意味着什么?