符号表存的是字符串,怎么关联到运行期间local和global的字典,这两个字典运行期间才有啊,符号表是在编译期生成,怎么能关联到运行期间的命名空间?
co_consts
:常量表MAKE_FUNCTION
之前通常有LOAD_CONST <index into co_consts>
PyCodeObject *
压栈,随后 MAKE_FUNCTION
把它取出来组装成 PyFunctionObject
。co_names
/ co_varnames
/ co_freevars
/ co_cellvars
:符号表PyCodeObject
的实体 → 存在 co_consts
PyFunctionObject
→ 存在栈帧的命名空间(dict 或 fastlocals)MAKE_FUNCTION 0
(或 3.11+ 的 MAKE_FUNCTION
)只干三件事:STORE_NAME
/STORE_FAST
/STORE_GLOBAL
指令把它放进某个命名空间(模块 __dict__
、局部变量数组或闭包单元)。STORE_*
字节码塞进当前帧的 locals、globals 或 closure 里。PyCodeObject 不是“实体”,它是一个 C 结构体,表示一段代码的静态信息(字节码、常量、变量名等),在编译期就已经构造好。
2. 常量表不是在运行期生成的,它是编译器在 compile() 阶段就填充好的。
3. 运行期只是加载这些结构,而不是重新生成它们