java – python“elif”的编译方式与else不同:if?
发布时间:2020-12-14 23:59:28 所属栏目:Java 来源:网络整理
导读:我知道在C,C,Java和C#等语言中,( C# example)else if语句是语法糖,因为它实际上只是一个if语句后跟一个if语句. else if (conition(s)) { ... 等于 else { if (condition(s)) { ...} 但是,在python中,有一个特殊的elif语句.我一直想知道这是否只是开发人员的
我知道在C,C,Java和C#等语言中,(
C# example)else if语句是语法糖,因为它实际上只是一个if语句后跟一个if语句.
else if (conition(s)) { ... 等于 else { if (condition(s)) { ... } 但是,在python中,有一个特殊的elif语句.我一直想知道这是否只是开发人员的简写,或者是否有一些隐藏的优化python可以做到这一点,比如更快解释?但这对我来说没有意义,因为其他语言也会这样做(比如JavaScript).所以,我的问题是,elif语句只是开发人员使用的简写,还是隐藏了它通过这样做而获得的东西? 解决方法
如果您真的想知道解释器中幕后发生的事情,可以使用dis模块.在这种情况下:
>>> def f1(): ... if a: ... b = 1 ... elif aa: ... b = 2 ... >>> def f2(): ... if a: ... b = 1 ... else: ... if aa: ... b = 2 ... >>> dis.dis(f1) 2 0 LOAD_GLOBAL 0 (a) 3 POP_JUMP_IF_FALSE 15 3 6 LOAD_CONST 1 (1) 9 STORE_FAST 0 (b) 12 JUMP_FORWARD 15 (to 30) 4 >> 15 LOAD_GLOBAL 1 (aa) 18 POP_JUMP_IF_FALSE 30 5 21 LOAD_CONST 2 (2) 24 STORE_FAST 0 (b) 27 JUMP_FORWARD 0 (to 30) >> 30 LOAD_CONST 0 (None) 33 RETURN_VALUE >>> dis.dis(f2) 2 0 LOAD_GLOBAL 0 (a) 3 POP_JUMP_IF_FALSE 15 3 6 LOAD_CONST 1 (1) 9 STORE_FAST 0 (b) 12 JUMP_FORWARD 15 (to 30) 5 >> 15 LOAD_GLOBAL 1 (aa) 18 POP_JUMP_IF_FALSE 30 6 21 LOAD_CONST 2 (2) 24 STORE_FAST 0 (b) 27 JUMP_FORWARD 0 (to 30) >> 30 LOAD_CONST 0 (None) 33 RETURN_VALUE 看起来我们的两个函数使用相同的字节码 – 显然它们是等价的. 但是要小心,字节码是CPython的一个实现细节 – 没有人知道所有的python实现都在幕后做同样的事情 – 重要的是它们具有相同的行为.通过逻辑,您可以说服自己f1和f2应该做同样的事情,无论底层实现是否将其视为“合成糖”或者是否有更复杂的事情发生. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- java – 访问DownloadProvider时避免SecurityException
- GWT测试错误NoClassDefFoundError:com / google / gwt / d
- kvm虚拟化存储管理(3)
- java – 浏览器中没有垂直滚动
- java – Declare-and-throw与throw-without-is-declared异常
- java – BeanNotOfRequiredTypeException但实际上是$Proxy类
- Java生鲜电商平台-高并发核心技术订单与库存实战
- java开发_数字转换汉语中人民币的大写_完整版
- java – 有没有人用Lua构建Web应用程序?
- java – 在Windows,Linux下可见的访问器方法,但不是OS X.