gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:06:33 25 4
gpt4 key购买 nike

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

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

等于

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

但是在python中,有一个特殊的elif语句。我一直想知道这是否只是开发人员的简写,或者是否有一些隐藏的优化 python 可以因此做,比如更快地解释?但这对我来说没有意义,因为那时其他语言也会这样做(例如 JavaScript)。所以,我的问题是,在 python 中,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 实现在幕后做同样的事情——重要的是它们具有相同的行为。通过逻辑,您可以说服自己 f1f2 应该做同样的事情,无论底层实现是否将其视为“语法糖”或者是否存在某些东西更复杂的进行。

关于java - python "elif"的编译方式是否与 else : if? 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34304936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com