如何理解Python模块的private symbol table与函数的global symbol table?
关于Python模块私有符号表与函数全局符号表的解析
首先直接给你明确答案:你运行脚本后输出的{'__name__': '__main__', '__doc__': None, ...}完全就是当前模块的全局符号表!
下面给你拆解清楚这两个符号表的关系,以及怎么查看它们:
- 模块的私有符号表:每个Python模块在被加载时,都会生成一个专属的私有符号表,本质是个字典,用来存储模块内所有的变量、函数、类等标识符和对应的对象。你可以把它理解成模块的"全局命名空间"——模块里的所有顶级代码都在这个空间里运行。
- 函数的全局符号表:当你在模块里定义函数时,这个函数会自动把所在模块的私有符号表当作自己的
global作用域。也就是说,函数里用global关键字声明的变量,其实就是直接操作模块的私有符号表。
怎么查看不同场景下的符号表?
- 查看当前模块的全局符号表:就像你做的那样,直接调用
globals()函数,它会返回当前模块私有符号表的字典引用。 - 查看其他模块的私有符号表:导入模块后,访问它的
__dict__属性就行。比如:
import os print(os.__dict__)
这个输出就是os模块的私有符号表内容。
3. 查看函数的全局符号表:每个函数对象都有__globals__属性,它直接指向函数所属模块的私有符号表。举个例子:
def my_func(): x = 10 print("局部变量:", locals()) print("函数的全局符号表:", my_func.__globals__) my_func()
运行后你会发现,my_func.__globals__的内容和直接调用globals()的结果是一致的。
再补充一点:当你把脚本作为主程序运行时(比如python symbol_table.py),这个脚本会被当作名为__main__的模块加载,所以你打印的globals()就是这个__main__模块的私有符号表,也就是它的全局符号表。
内容的提问来源于stack exchange,提问作者Wizard
相关产品推荐
相关产品推荐

