【问题标题】:Why do I get 0 when I run "0 and True" or "0 and False"为什么我运行“0 and True”或“0 and False”时得到 0
【发布时间】:2014-04-01 18:03:41
【问题描述】:

考虑这段代码:

>>> 0 and True
0
>>> 0 and False
0

为什么我在 Python 中运行上述命令时得到0

【问题讨论】:

标签: python boolean-expression


【解决方案1】:

and 的第一个条件计算为False(在Python 中为0)时,第二个参数根本不计算,因为and 永远不会变为真。这称为短路。在这种情况下,表达式的结果是第一个操作数,在您的情况下为 0。

【讨论】:

    【解决方案2】:

    因为0 是一个假值(所有数字0 值,以及空容器,以及NoneFalse)。

    and 操作员短课程;如果左侧表达式的计算结果为假值,则返回,否则返回右侧表达式结果。

    or 运算符的作用相同,但用于真正的左值; 1 or False 返回1

    来自Boolean operations 文档:

    表达式x and y首先计算x;如果x 为假,则返回其值;否则,y 被评估并返回结果值。

    表达式x or y首先计算x;如果x 为真,则返回其值;否则,y 被评估并返回结果值。

    您可以方便地使用它:

    foo = None
    if something_or_other:
        foo = lambda arg: arg * 3
    
    outcome = foo and foo('bar')
    outcome = foo or expensive_call()
    

    其中foo 仅在实际定义时才被调用,而不是Noneexpensive_call() 仅在 foo 尚未绑定到真值时才被调用。

    【讨论】:

      【解决方案3】:

      您正在与零进行与运算。你应该总是得到零。

      【讨论】:

      • 按位& 是这样,但答案是布尔型and 更复杂(并且特定于Python)。
      【解决方案4】:

      这是因为,逻辑运算符是从左到右计算的。因此,对于 or,如果为 True,则找到未计算的表达式的其余部分:

      >>> True or "one"
      True
      >>> False or "one"
      'one'
      

      and 也类似,如果 False 发现表达式的其余部分被忽略:

      >>> True and "one"
      'one'
      >>> False and "one"
      False
      

      在编译器设计中,这个概念被称为短路,大多数编译器的设计都是一样的。

      【讨论】:

        【解决方案5】:

        大多数编程语言都具有此功能,它是快速分支检测,在您的情况下and 如果第一个条件为假,则评估失败并且第二个(其他)条件从不检查
        在其他情况下or 如果第一个条件返回 true 第二个(其他)条件从不检查并且结果将为 true
        这是一个非常酷的功能,例如看这个示例:

        if( list != null and !list.isEmpty() ) {
            // do stuff
        }
        

        如果这个特性不存在,这个if语句会导致异常,但是现在listnull!list.isEmpty()永远不会运行

        【讨论】:

        • 请注意,虽然许多语言都会短路,但返回第一个操作数(如果为假)或第二个操作数(如果第一个为真)是某种特定于 Python 的功能。例如,Java 也会短路,但总是返回 truefalse,而不是真值(因为 Java 没有这样的概念)。
        猜你喜欢
        • 2017-11-11
        • 2015-06-21
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 2021-08-08
        • 1970-01-01
        • 1970-01-01
        • 2021-08-13
        相关资源
        最近更新 更多