首页 新闻 会员 周边 捐助

怎么看MAKE_FUNCTION干了啥,字节码指令

0
[已关闭问题] 关闭于 2025-08-28 10:09

MAKE_FUNCTION 本身 只有一条字节码指令
它真正的“工作”是 一次性把栈顶若干个元素打包成函数对象
因此 反编译时看不到额外指令
要观察它“吃了什么、吐了什么”,只需看 执行前后栈的变化

下面用一段最小例子,边看边验证:
Python
复制
import dis

# 一个最简单的函数
code = compile('lambda x, y=1: x + y', '<string>', 'eval')
dis.dis(code)
 
输出(CPython 3.11):
复制
  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,吐出 新函数对象

_java_python的主页 _java_python | 小虾三级 | 园豆:984
提问于:2025-08-28 10:08
< >
分享
所有回答(1)
0

一句话记忆

MAKE_FUNCTION 就是 “弹出 N 个常量 → 生成函数对象 → 压回 1 个函数”;
具体弹多少、弹什么,由它前面的 LOAD_CONST 数量决定,字节码里 没有额外动作。
_java_python | 园豆:984 (小虾三级) | 2025-08-28 10:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册