嵌套的 ifs 是否等于 和 逻辑?

Are nested ifs equals to and logic?

提问人:Soroosh Noorzad 提问时间:3/2/2023 更新时间:3/2/2023 访问量:75

问:

我想知道这两个 Python 代码是否总是相同的。

if condition_1:
    if condition_2:
        some_process

if condition_1 and condition_2:
    some_process

我搜索了一下,但没有找到这个问题的任何具体答案。因此,例如,您正在尝试计算一个变量,但无法确定该变量是否存在。因此,首先,您应该检查变量是否存在。我们可以在计算的同时使用带有“and”逻辑的变量存在性检查吗?它总是适用吗?

python if-statement 嵌套 逻辑

评论


答:

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_nameco_linetableco_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
你打败了我:-)