代码之家  ›  专栏  ›  技术社区  ›  lbear

python中的布尔比较[重复]

  •  1
  • lbear  · 技术社区  · 7 年前

    Python似乎用(我认为)相对简单的语法进行了奇怪的评估。有人能解释一下幕后发生了什么吗?python认为在第一种情况下发生了什么?

    >>> x = 'foo'
    >>> 'f' in x == True
    False
    >>> ('f' in x) == True
    True
    >>> 'f' in (x == True)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: argument of type 'bool' is not iterable
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   willeM_ Van Onsem    7 年前

    你在这里看到的是 chained comparisons :

    'f' in x == True
    

    二者都 in == 都是比较。现在Python解释 链式 具有 含蓄的 and . 你基本上写了:

    'f' in x and x == True
    

    第二次检查失败。

    例如,如果您编写:

    a < b in c
    

    它是以下内容的缩写:

    a < b and b in c
    

    (除了表达式只计算一次)。

    如果我们看一下文档,就会发现有11个比较器:

    comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "<>" | "!="
                       | "is" ["not"] | ["not"] "in"
    

    此外,它还指出:

    比较可以是 任意链接 ,例如。, x < y <= z 是 相当于 x < y and y <= z y 仅评估 (但在这两种情况下,当 x < y 是 发现为 false ).

    正式,如果 a , b , c y , z 是表达式和 op1 , op2 , ..., opN 是比较运算符,则 a op1 b op2 c ... y opN z 相当于 a op1 b and b op2 c and ... y opN z 除了 每个表达式最多计算一次。