Python字节码是CPython虚拟机可执行的中间指令,用文本反汇编后是“类似汇编”的指令序列

在 Python 中,字节码(bytecode) 是 Python 源代码被编译后生成的中间表示形式,由 Python 虚拟机(CPython 的 PVM)执行。虽然字节码本身是二进制格式(存储在 .pyc 文件中),但我们可以通过标准库 dis 模块将其反汇编为人类可读的文本形式

下面是一个完整的 Python 字节码文本示例


✅ 示例:查看函数的字节码

import dis

def add(a, b):
    return a + b

# 反汇编函数 add 的字节码
dis.dis(add)

🔽 输出结果(Python 3.10+ 示例):

  2           0 LOAD_FAST                0 (a)
              2 LOAD_FAST                1 (b)
              4 BINARY_ADD
              6 RETURN_VALUE

🔍 字节码说明:

含义
2 源代码行号(对应 return a + b 所在行)
0, 2, 4, 6 字节码指令的偏移地址(以字节为单位)
LOAD_FAST 将局部变量(如参数 a, b)压入栈
BINARY_ADD 弹出栈顶两个值,相加后将结果压回栈
RETURN_VALUE 弹出栈顶值并返回

这就是 CPython 虚拟机实际执行的“指令”。


🧪 更复杂示例:带常量和函数调用

import dis

def greet(name):
    msg = "Hello, " + name
    print(msg)

dis.dis(greet)

输出(简化版):

  2           0 LOAD_CONST               1 ('Hello, ')
              2 LOAD_FAST                0 (name)
              4 BINARY_ADD
              6 STORE_FAST               1 (msg)

  3           8 LOAD_GLOBAL              0 (print)
             10 LOAD_FAST                1 (msg)
             12 CALL_FUNCTION            1
             14 POP_TOP
             16 LOAD_CONST               0 (None)
             18 RETURN_VALUE
  • LOAD_CONST:加载常量(如字符串 'Hello, '
  • STORE_FAST:将栈顶值存入局部变量 msg
  • LOAD_GLOBAL:加载全局名字(如 print 函数)
  • CALL_FUNCTION 1:调用函数,参数个数为 1
  • POP_TOP:丢弃 print 的返回值(因为没用到)
  • 最后返回 None(Python 函数默认返回 None

💡 补充知识

  • 字节码文件保存在 __pycache__ 目录下(如 add.cpython-311.pyc)。
  • 使用 compile() 可手动编译源码为 code 对象:
    code = compile('x = 1 + 2', '<string>', 'exec')
    dis.dis(code)
    
  • 字节码是平台无关的,但Python 版本相关(不同版本指令可能不同)。

✅ 总结

Python 字节码的文本表示不是原始二进制,而是通过 dis 模块生成的助记符形式,便于开发者理解程序底层执行逻辑、优化性能或学习 Python 内部机制。

如果你想看真正的二进制字节码,可以读取 .pyc 文件,但通常开发中只需关注 dis 的文本输出即可。

posted @ 2026-01-26 11:12  jerry-mengjie  阅读(3)  评论(0)    收藏  举报