Meh*_*dad 4 python loops bytecode cpython python-internals
我注意到Python的字节码在这里有一个有趣的特点.
该CONTINUE_LOOP操作码取入一个target将表示循环的指令继续执行,这是一个参数FOR_ITER的指令.
该BREAK_LOOP操作码,但是,并没有做到这一点.它只会突破当前(最里面)的循环.
这背后的原因是什么?为什么它可能continue而不是break外循环?
你误解了目标.处理嵌套循环不需要该值.相反,目标标记字节码流中的点在指令之后移动到.BREAK不需要这样的目标,因为该值已在其他地方定义.
BREAK_LOOP结束循环,因此循环后继续执行.该SETUP_LOOP指令已经定义了端点,因此解释器不需要任何其他信息来执行该操作码.
CONTINUE_LOOP另一方面需要被告知在哪里继续.在大多数循环中,使用JUMP_ABSOLUTE操作码,并CONTINUE_LOOP在此处回应该指令.CONTINUE_LOOP记录更多信息来处理try语句(跟踪堆栈展开).
在评估循环中,异常处理(try: ... except:和try
: ... finally:)以及上下文管理器(with ...:和async with ...:)使用帧块的通用概念,其具有为其记录的出口点,这是BREAK_LOOP指令依赖于此处的内容.不必跟踪偏移量就这样简单,并避免编译器和评估循环不得不重复(退出点也用于其他场景,而不仅仅是break语句).
但是跳转更通用,因此它们的偏移更容易跟踪与指令本身相关联.