python - 为什么 Python CONTINUE LOOP 允许外循环,而 BREAK LOOP 不允许?

标签 python loops bytecode cpython python-internals

我注意到 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/

相关文章:

python - 如何直接从 cmd 运行 .py 脚本?

ruby - 在 Ruby 中构建事件循环时如何避免无限递归?

python - 如何在python中动态更新字典(键/数据)

c++ - 我如何逐行循环输入并在 C++ 中遍历每一行;

java - 哪些 Java 代码会强制 javac 1.6 使用 'swap' 和 'nop' 操作码?

java - 局部变量堆栈何时创建?

python - NumPy 中的外部产品 : Vectorizing six nested loops

python - gdal使用python翻译比例并保存为jpg

python - 了解请求与 grequests

python - 名称和函数体如何存储在 Python 代码对象中?