提问人:Soroosh Noorzad 提问时间:3/2/2023 更新时间:3/2/2023 访问量:75
嵌套的 ifs 是否等于 和 逻辑?
Are nested ifs equals to and logic?
问:
我想知道这两个 Python 代码是否总是相同的。
if condition_1:
if condition_2:
some_process
和
if condition_1 and condition_2:
some_process
我搜索了一下,但没有找到这个问题的任何具体答案。因此,例如,您正在尝试计算一个变量,但无法确定该变量是否存在。因此,首先,您应该检查变量是否存在。我们可以在计算的同时使用带有“and”逻辑的变量存在性检查吗?它总是适用吗?
答:
5赞
Brian61354270
3/2/2023
#1
是的,它们总是等价的。事实上,它们编译为完全相同的字节码,仅在一些元数据1 上有所不同:
# Python 3.10.6 (main, Nov 14 2022, 16:10:14) [GCC 11.3.0]
# Type 'copyright', 'credits' or 'license' for more information
# IPython 7.31.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]: def v1():
...: if x:
...: if y:
...: pass
...:
In [2]: def v2():
...: if x and y:
...: pass
...:
In [3]: import dis
In [4]: dis.dis(v1)
2 0 LOAD_GLOBAL 0 (x)
2 POP_JUMP_IF_FALSE 7 (to 14)
3 4 LOAD_GLOBAL 1 (y)
6 POP_JUMP_IF_FALSE 9 (to 18)
4 8 NOP
10 LOAD_CONST 0 (None)
12 RETURN_VALUE
2 >> 14 LOAD_CONST 0 (None)
16 RETURN_VALUE
3 >> 18 LOAD_CONST 0 (None)
20 RETURN_VALUE
In [5]: dis.dis(v2)
2 0 LOAD_GLOBAL 0 (x)
2 POP_JUMP_IF_FALSE 7 (to 14)
4 LOAD_GLOBAL 1 (y)
6 POP_JUMP_IF_FALSE 9 (to 18)
3 8 NOP
10 LOAD_CONST 0 (None)
12 RETURN_VALUE
2 >> 14 LOAD_CONST 0 (None)
16 RETURN_VALUE
>> 18 LOAD_CONST 0 (None)
20 RETURN_VALUE
In [6]: v1.__code__.co_code == v2.__code__.co_code
Out[6]: True
1 即函数代码对象的 co_name
、co_linetable
和 co_lnotab
属性,这些属性不影响代码的执行。查看
import types
print(
{
attr: (
getattr(v1.__code__, attr),
getattr(v2.__code__, attr),
)
for attr in dir(types.CodeType) if "co_" in attr
}
)
详细比较函数各自的代码对象。
评论
0赞
Soroosh Noorzad
3/2/2023
但是,正如评论所提到的,这些陈述正在从左到右进行检查。因此,如果cond_1在“and”逻辑中排在第一位,最好提到它们是相同的。是真的吗?
1赞
JonSG
3/2/2023
你打败了我:-)
评论