我有以下代码,
In [4]: def foo():
...: a = 2
...: b = 3
...: return a + b
...:
...:
In [5]: import dis
In [6]: dis.dis(foo)
2 0 LOAD_CONST 1 (2)
2 STORE_FAST 0 (a)
3 4 LOAD_CONST 2 (3)
6 STORE_FAST 1 (b)
4 8 LOAD_FAST 0 (a)
10 LOAD_FAST 1 (b)
12 BINARY_ADD
14 RETURN_VALUE
参考字节码:
我知道:
第一列是行号:2、3、4 第三列是操作名称:LOAD_CONST等
,第五列是代码:(2((a(
第二列怎么样:0、2 4、6、8...
和第四列 1、0、2、1
您能否提供提示以查找相关信息?
第二列是字节码字节索引;每个字节码由 2 个字节组成(一个表示确切的操作码,另一个表示操作码参数值(。它实际上是列 #4;输出中有两列没有当前值。
对于您的函数,您可以找到包含字节码作为__code__.co_code
属性的字节串:
>>> foo.__code__.co_code
b'dx01}x00dx02}x01|x00|x01x17x00Sx00'
所以b'dx01'
是LOAD_CONST 1
,b'}x00'
是STORE_FAST 0
,等等。
这记录在dis.disco()
函数下:
输出分为以下列:
行
- 号,用于每行的第一条指令
- 当前指令,表示为
-->
,- 带有标签的说明,标有
>>
,- 指令的地址,
- 操作代码名称,
- 操作参数,以及
- 括号中参数的解释。
当您使用dis.dis()
时,列 #2(当前指令(将始终为空。
列 #3,标记的指令,每当有循环或测试时使用。例如:
>>> dis.dis('if foo:n for i in it:n print(i)nelse: print(bar)')
1 0 LOAD_NAME 0 (foo)
2 POP_JUMP_IF_FALSE 28
2 4 SETUP_LOOP 30 (to 36)
6 LOAD_NAME 1 (it)
8 GET_ITER
>> 10 FOR_ITER 12 (to 24)
12 STORE_NAME 2 (i)
3 14 LOAD_NAME 3 (print)
16 LOAD_NAME 2 (i)
18 CALL_FUNCTION 1
20 POP_TOP
22 JUMP_ABSOLUTE 10
>> 24 POP_BLOCK
26 JUMP_FORWARD 8 (to 36)
4 >> 28 LOAD_NAME 3 (print)
30 LOAD_NAME 4 (bar)
32 CALL_FUNCTION 1
34 POP_TOP
>> 36 LOAD_CONST 0 (None)
38 RETURN_VALUE
有 4 个跳跃目标,其中多个操作码可以触发跳转到其中一个位置。它们用作便于阅读的视觉标记。