当前位置:  开发笔记 > 编程语言 > 正文

python"elif"的编译方式是否与else不同:if?

如何解决《python"elif"的编译方式是否与else不同:if?》经验,为你挑选了1个好方法。

我知道在C,C++,Java和C#等语言中,(C#示例)else if语句是语法糖,因为它实际上只是一个else语句后跟一个if语句.

else if (conition(s)) { ...

等于

else {
    if (condition(s)) { ...
}

但是,在python中,有一个特殊的elif声明.我一直想知道这是否只是开发人员的简写,或者是否有一些隐藏的优化python可以做到这一点,比如更快解释?但这对我来说没有意义,因为其他语言也会这样做(比如JavaScript).所以,我的问题是,在python中,elif语句只是开发人员使用的简写,还是隐藏了它通过这样做而获得的东西?



1> mgilson..:

如果您真的想知道解释器幕后发生的事情,可以使用该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应该做同样的事情,无论底层实现是否将其视为"合成糖"或者是否存在更复杂的事情.

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有