热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么Python的CONTINUE_LOOP允许外部循环,而BREAK_LOOP不允许?

如何解决《为什么Python的CONTINUE_LOOP允许外部循环,而BREAK_LOOP不允许?》经验,为你挑选了1个好方法。

我注意到Python的字节码在这里有一个有趣的特点.

CONTINUE_LOOP操作码取入一个target将表示循环的指令继续执行,这是一个参数FOR_ITER的指令.

BREAK_LOOP操作码,但是,并没有做到这一点.它只会突破当前(最里面)的循环.

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



1> Martijn Piet..:

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

BREAK_LOOP结束循环,因此循环继续执行.该SETUP_LOOP指令已经定义了端点,因此解释器不需要任何其他信息来执行该操作码.

CONTINUE_LOOP另一方面需要被告知在哪里继续.在大多数循环中,使用JUMP_ABSOLUTE操作码,并CONTINUE_LOOP在此处回应该指令.CONTINUE_LOOP记录更多信息来处理try语句(跟踪堆栈展开).

在评估循环中,异常处理(try: ... except:try : ... finally:)以及上下文管理器(with ...:async with ...:)使用帧块的通用概念,其具有为其记录的出口点,这是BREAK_LOOP指令依赖于此处的内容.不必跟踪偏移量就这样简单,并避免编译器和评估循环不得不重复(退出点也用于其他场景,而不仅仅是break语句).

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


推荐阅读
author-avatar
不会遗忘528_757
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有