MAKE_FUNCTION
本身 只有一条字节码指令,
它真正的“工作”是 一次性把栈顶若干个元素打包成函数对象,
因此 反编译时看不到额外指令;
要观察它“吃了什么、吐了什么”,只需看 执行前后栈的变化。
import dis
# 一个最简单的函数
code = compile('lambda x, y=1: x + y', '<string>', 'eval')
dis.dis(code)
1 0 LOAD_CONST 0 (<code object <lambda> ...>)
2 LOAD_CONST 1 (('y', 1))
4 MAKE_FUNCTION
6 RETURN_VALUE
指令 | 栈顶→栈底 | 说明 |
---|---|---|
LOAD_CONST 0 |
[code_obj] | 函数体字节码 |
LOAD_CONST 1 |
[defaults, code_obj] | 默认参数元组 |
MAKE_FUNCTION |
[function] | 吃掉 defaults/code_obj,吐出 新函数对象 |
一句话记忆
MAKE_FUNCTION
就是 “弹出 N 个常量 → 生成函数对象 → 压回 1 个函数”;LOAD_CONST
数量决定,字节码里 没有额外动作。