字节码之前的数字是原始二进制字节码的偏移量:
>>> func.__code__.co_code
'd\x01\x00}\x00\x00d\x00\x00S'
一些字节码附带了影响每个字节码如何工作的附加信息(参数),偏移量告诉您在字节流中的哪个位置找到了字节码。
The LOAD_CONST
字节码(ASCIId
例如,十六进制 64) 之后是两个附加字节,编码对与字节码关联的常量的引用。结果,STORE_FAST
操作码(ASCII}
,十六进制 7D)可在索引 3 处找到。
The dis模块文档 http://docs.python.org/2/library/dis.html#python-bytecode-instructions列出每条指令的含义。为了LOAD_CONST
, 它说:
Pushes co_consts[consti]
到堆栈上。
这是指co_consts
始终与代码对象一起出现的结构;编译器构造:
>>> func.__code__.co_consts
(None, 1)
操作码从该结构加载索引 1(字节码中的 01 00 字节编码为 1),并且dis
已经帮你查到了;这就是价值1
.
下一个指令,STORE_FAST http://docs.python.org/2/library/dis.html#opcode-STORE_FAST描述为:
将 TOS 存储到本地co_varnames[var_num]
.
Here TOS指堆栈顶部;请注意,LOAD_CONST
just pushed一些东西进入堆栈,1
value. co_varnames
是另一种结构;它引用局部变量名称,操作码引用索引 0:
>>> func.__code__.co_varnames
('x',)
dis
也查了一下,您在代码中使用的名称是x
。因此,该操作码存储1
into x
.
Another LOAD_CONST
loads None
从索引 0 开始入栈,然后是RETURN_VALUE http://docs.python.org/2/library/dis.html#opcode-RETURN_VALUE:
将 TOS 返回给函数的调用者。
所以这条指令占据了堆栈的顶部(与None
常量)并从此代码块返回。None
是没有显式函数的默认返回值return
陈述。
你遗漏了一些东西dis
输出,行号:
>>> dis.dis(func)
2 0 LOAD_CONST 1 (1)
3 STORE_FAST 0 (x)
6 LOAD_CONST 0 (None)
9 RETURN_VALUE
请注意2
在第一行;这是原始源代码中的行号,其中包含用于这些指令的 Python 代码。 Python代码对象有co_lnotab
and co_firstlineno
属性可让您将字节码映射回原始源中的行号。dis
在显示反汇编时为您执行此操作。