【问题标题】:Why does `False is False is False` evaluate to `True`?为什么`False is False is False`评估为`True`?
【发布时间】:2015-03-22 04:00:12
【问题描述】:

为什么在 Python 中以这种方式评估它:

>>> False is False is False
True

但是当用括号尝试时表现如预期:

>>> (False is False) is False
False

【问题讨论】:

    标签: python python-internals


    【解决方案1】:

    a is b is c 这样的链接运算符等价于a is b and b is c

    所以第一个示例是False is False and False is False,其计算结果为True and True,其计算结果为True

    有括号会导致将一个评估的结果与下一个变量进行比较(正如您所说的那样),因此(a is b) is ca is b 的结果与c 进行比较。

    【讨论】:

    • 有趣的是,你可以任意链接多个“is False”,结果仍然为真eval(" is ".join(["False" for i in range(n)]))
    • 因为它适用于任何链——比如1 < 2 < 3 < 4 所以:1<2 and 2<3 and 3<4
    • IMO,这个功能让它读起来更像是简单的英语。例如,如果您向某人解释单身人士,您可以指出 None is None is None
    【解决方案2】:

    你的表情

    False is False is False
    

    被视为

    (False is False) and (False is False)
    

    所以你得到

    True and True
    

    计算结果为True

    您也可以将这种链接与其他运算符一起使用。

    1 < x < 10
    

    【讨论】:

    • 所以0 &gt; 2 is False 返回False -> 多么直观的行为:)
    • @pbaranski 括号更有意义:(0 &gt; 2) is False
    【解决方案3】:
    >>> False is False is False
    True
    

    在这种情况下,每个 False 对都会被评估。前两个 False 被求值,如果是True,那么第二个和第三个False 被求值并返回结果。

    在这种情况下,False is False is False 相当于and 2 个命令的结果False is False

    【讨论】:

      【解决方案4】:

      我认为False is False is False 表示(False is False) and (False is False),但(False is False) is False 表示:

      >>> (False is False) is False
      False
      >>> a_true = (False is False)
      >>> a_true
      True
      >>> a_true is False
      False
      

      所以,你得到了结果。

      【讨论】:

        【解决方案5】:

        引用Python official documentation

        形式上,如果abc、...、yz 是表达式,而op1op2、...、opN 是比较运算符, 那么a op1 b op2 c ... y opN z 等价于a op1 b and b op2 c and ... y opN z,只是每个表达式最多计算一次。

        所以,False is False is False 被评估为

        (False is False) and (False is False)
        

        第二个False is False 表达式使用原始表达式中的第二个False,有效地转换为

        True and True
        

        这就是为什么第一个表达式计算为True

        但是在第二个表达式中,求值顺序如下。

        (False is False) is False
        

        实际上是

        True is False
        

        这就是为什么结果是False

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-03-15
          • 2015-09-30
          • 1970-01-01
          • 1970-01-01
          • 2022-01-10
          • 2019-04-24
          • 2020-04-19
          • 2014-02-16
          相关资源
          最近更新 更多