Python字节码中'>>'的含义

cob*_*bie 10 python bytecode virtual-machine

我已经反汇编了以下python代码

def factorial(n):
    if n <= 1:
        return 1
    elif n == 2:
        return 2
    elif n ==4:
        print('hi')
    return n * 2
Run Code Online (Sandbox Code Playgroud)

以及生成的字节码

 2        0 LOAD_FAST                0 (n)
          3 LOAD_CONST               1 (1)
          6 COMPARE_OP               1 (<=)
          9 POP_JUMP_IF_FALSE         16

3        12 LOAD_CONST               1 (1)
         15 RETURN_VALUE        

4     >> 16 LOAD_FAST                0 (n)
         19 LOAD_CONST               2 (2)
         22 COMPARE_OP               2 (==)
         25 POP_JUMP_IF_FALSE        32

5        28 LOAD_CONST               2 (2)
         31 RETURN_VALUE        

6     >> 32 LOAD_FAST                0 (n)
         35 LOAD_CONST               3 (4)
         38 COMPARE_OP               2 (==)
         41 POP_JUMP_IF_FALSE        52

7        44 LOAD_CONST               4 ('hi')
         47 PRINT_ITEM          
         48 PRINT_NEWLINE       
         49 JUMP_FORWARD             0 (to 52)

8     >> 52 LOAD_FAST                0 (n)
         55 LOAD_CONST               2 (2)
         58 BINARY_MULTIPLY     
         59 RETURN_VALUE        
Run Code Online (Sandbox Code Playgroud)

上述字节码中的">>"符号代表什么?

Mar*_*ers 12

他们是跳跃目标; 位置较早的*JUMP*字节码跳转到满足条件时.

第一跳:

         9 POP_JUMP_IF_FALSE       16
Run Code Online (Sandbox Code Playgroud)

跳转到偏移16,所以在偏移16处,输出有一个目标>>:

4     >> 16 LOAD_FAST                0 (n)
Run Code Online (Sandbox Code Playgroud)

dis.disassemble()函数docs中命名每一列:

[...]

  1. 带标签的指示,标有>>,

dis.findlabels()功能:

检测作为跳转目标的代码对象代码中的所有偏移量,并返回这些偏移量的列表.