首页 新闻 会员 周边 捐助

符号表存的是字符串,怎么关联到运行期间local和global的字典,这两个字典运行期间才有啊,符号表是在编译期生成,怎么能关联到运行期间的命名空间?

0
[已解决问题] 解决于 2025-09-01 10:31

符号表存的是字符串,怎么关联到运行期间local和global的字典,这两个字典运行期间才有啊,符号表是在编译期生成,怎么能关联到运行期间的命名空间?

问题补充:
  1. co_consts:常量表
    编译期就把 所有字面常量(数字、字符串、代码对象、元组等)放进这个元组。
    所以在 MAKE_FUNCTION 之前通常有
    LOAD_CONST <index into co_consts>
     
    这条指令把真正的 PyCodeObject * 压栈,随后 MAKE_FUNCTION 把它取出来组装成 PyFunctionObject
  2. co_names / co_varnames / co_freevars / co_cellvars:符号表
    这些列表里只放字符串(变量名、全局名、闭包名……),不放对象实体。运行时解释器用这些字符串作为键去查字典或数组。
_java_python的主页 _java_python | 小虾三级 | 园豆:984
提问于:2025-09-01 10:28
< >
分享
最佳答案
0
  • PyCodeObject 的实体 → 存在 co_consts
  • 变量/函数名字符串 → 存在符号表
  • 运行时生成的 PyFunctionObject → 存在栈帧的命名空间(dict 或 fastlocals)
MAKE_FUNCTION 0(或 3.11+ 的 MAKE_FUNCTION)只干三件事:
  1. 从栈顶依次弹出
    • 函数对应的 代码对象(PyCodeObject)
    • (可选)函数名、defaults、closure 等额外信息
  2. 用这些数据在 运行时 新建一个 PyFunctionObject(Python 层面就是普通的 function 对象)。
  3. 把这个新对象重新压回操作数栈,等待随后的 STORE_NAME/STORE_FAST/STORE_GLOBAL 指令把它放进某个命名空间(模块 __dict__、局部变量数组或闭包单元)。
换句话说:
  • 符号表里(co_names、co_varnames 等)只有字符串索引,从来没有 PyFunctionObject 或 PyCodeObject 的“实体”。
  • PyFunctionObject 本身(连同它内部指向的 PyCodeObject)只在运行时创建,创建完就被当成普通值,通过随后的 STORE_* 字节码塞进当前帧的 locals、globals 或 closure 里。
  • PyCodeObject 不是“实体”,它是一个 C 结构体,表示一段代码的静态信息(字节码、常量、变量名等),在编译期就已经构造好。
    2. 常量表不是在运行期生成的,它是编译器在 compile() 阶段就填充好的。
    3. 运行期只是加载这些结构,而不是重新生成它们

_java_python | 小虾三级 |园豆:984 | 2025-09-01 10:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册