我注意到 Python 的字节码中有一个有趣的特性 here .
CONTINUE_LOOP
操作码接受一个 target
参数,表示要继续执行的循环指令,这是一个 FOR_ITER
指令。
但是,BREAK_LOOP
操作码不会这样做。它只会跳出当前(最内层)循环。
这背后的原因是什么?为什么可以continue
但不能 break
外循环?
最佳答案
您误解了目标。不需要该值来处理嵌套循环。相反,目标标记字节码流中的点以在指令之后移动到。 BREAK
不需要这样的目标,因为该值已在别处定义。
BREAK_LOOP
结束循环,因此在循环 之后继续执行。 SETUP_LOOP
instruction已经定义了端点,所以解释器不需要任何额外的信息来执行这个操作码。
CONTINUE_LOOP
另一方面需要被告知继续到哪里。在大多数循环中,一个 JUMP_ABSOLUTE
opcode被使用,并且 CONTINUE_LOOP
在此处回显该指令。 CONTINUE_LOOP
记录了更多信息来处理 try
语句(以跟踪堆栈展开)。
在评估循环中,异常处理(try: ... except:
和try
: ... finally:
) 以及上下文管理器(with ...:
和 async with ...:
)使用一个广义的概念帧 block ,其中记录了一个退出点,这是 BREAK_LOOP
指令在这里所依赖的。这种方式不必跟踪偏移量更简单,并且避免了编译器和评估循环必须自己重复(退出点也用于其他场景,而不仅仅是 break
语句)。
但是跳转更通用,因此它们的偏移量更容易跟踪与指令本身相关联。
关于python - 为什么 Python CONTINUE LOOP 允许外循环,而 BREAK LOOP 不允许?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44384781/