分析 Python 字节码

Analysing a Python bytecode

在下面的Python字节码中,我想了解为什么i的值在JUMP_ABSOLUTE之前没有递增?

>>> import dis
>>> dis.dis("""for i in range(4):
...     print(i)
... """)
  1           0 SETUP_LOOP              24 (to 26)
              2 LOAD_NAME                0 (range)
              4 LOAD_CONST               0 (4)
              6 CALL_FUNCTION            1
              8 GET_ITER
        >>   10 FOR_ITER                12 (to 24)
             12 STORE_NAME               1 (i)

  2          14 LOAD_NAME                2 (print)
             16 LOAD_NAME                1 (i)
             18 CALL_FUNCTION            1
             20 POP_TOP
             22 JUMP_ABSOLUTE           10
        >>   24 POP_BLOCK
        >>   26 LOAD_CONST               1 (None)
             28 RETURN_VALUE

i的进化是在第10行通过调用range的魔术方法__next__简单完成的。