当BREAK_LOOP没有?时,为什么Python的CONTINUE_LOOP允许外循环?

时间:2017-06-06 08:16:37

标签: python loops bytecode cpython python-internals

我注意到Python的字节码here中有一个有趣的特点。

CONTINUE_LOOP操作码接受target参数,该参数表示循环继续执行的指令,即FOR_ITER指令。

然而,BREAK_LOOP操作码不会这样做。它只会突破当前(最里面的)循环。

这背后的原因是什么?为什么continue而不是break外循环?

1 个答案:

答案 0 :(得分:9)

你误解了目标。处理嵌套循环不需要该值。相反,目标标记字节码流中的点在指令之后移动到。 BREAK_LOOP不需要这样的目标,因为该值已在其他地方定义。

CONTINUE_LOOP结束循环,因此在循环后继续执行SETUP_LOOP instruction已经定义了端点,因此解释器不需要任何其他信息来执行此操作码。

另一方面,

CONTINUE_LOOP需要告知在哪里继续。在大多数循环中,使用JUMP_ABSOLUTE opcodeCONTINUE_LOOP在此处回应该指令。 try记录更多信息来处理try: ... except:语句(跟踪堆栈展开)。

在评估循环中,异常处理(try : ... finally:with ...:)以及上下文管理器(async with ...:BREAK_LOOP)使用的通用概念帧块,它有一个为其记录的出口点,这是break指令依赖于此处的内容。不必跟踪偏移量就这样简单,避免编译器和评估循环不得不重复(退出点也用于其他场景,而不仅仅是ERROR in ./~/css-loader!./~/sass-loader/lib/loader.js!./app/css/bootstrap.css Module not found: Error: Can't resolve '../fonts/glyphicons-halflings-regular.woff2' in '/Users/me/reactjs_dutchboiler/app/css' @ ./~/css-loader!./~/sass-loader/lib/loader.js!./app/css/bootstrap.css 6:4720-4774 @ ./app/css/bootstrap.css @ ./app/app.jsx @ multi (webpack)-dev-server/client?http://localhost:8080 webpack/hot/dev-server ./app/app.jsx 语句)。

但是跳转更通用,因此它们的偏移更易于跟踪与指令本身相关联。