首页 新闻 会员 周边 捐助

字节码里面都是LOAD_CONST,没看到STORE_CONST

0
[已解决问题] 解决于 2025-08-28 09:28

常量表只读,因此字节码只有“加载常量”指令,没有“存储常量”指令。
STORE_NAME 与常量无关,它把 变量名 → 值 绑定写入 当前作用域的名字表(locals/globals),而不是向常量表写数据

看代码对象两张表:
CO_CONST 常量表
CO_NAMES变量表

_java_python的主页 _java_python | 小虾三级 | 园豆:984
提问于:2025-08-28 09:27
< >
分享
最佳答案
0

Python 字节码 只有 LOAD_CONST,没有 STORE_CONST,原因有三点:
常量只读
常量表 (co_consts) 在编译期就冻结为 只读元组,运行时不能再增删或修改。
创建阶段已完成
所有常量(字面量、代码对象、字符串、数值)在 编译阶段 就全部生成完毕,
因此不需要“运行时写入常量”这一指令。
指令语义限制
常量值只能被 读取 到栈上;
如果要“保存”一个值,字节码会把它存入 局部变量表 (STORE_FAST) 或 名字表 (STORE_NAME),而不是常量表。

MAKE_FUNCTION 0 把“一段字节码”包装成“可调用的函数对象”,这样后续才能 CALL_FUNCTION 去执行它——没有这一步,字节码只是一块死数据。
它到底干了什么?
吃进栈顶元素
当前栈顶必须是 代码对象(PyCodeObject)。
[code_obj] → [function_obj]
创建函数对象
在 C 层内部新建一个 PyFunctionObject,把
代码对象
全局命名空间
默认参数 / 闭包 / 注解(如果有)
全部打包进去。
把新鲜出炉的函数对象压回栈顶,供后续 CALL_FUNCTION 使用
没有它会怎样?
直接 CALL_FUNCTION code_obj 类型错误:代码对象不可调用
缺省参数、闭包 无法绑定

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