【问题标题】:Testing equality of three values测试三个值的相等性
【发布时间】:2012-12-10 17:25:08
【问题描述】:

这和我想的一样吗?在我看来,是的。我要求确定。

if n[i] == n[i+1] == n[i+2]:
    return True

这些相等吗?

if n[i] == n[i+1] and n[i+1] == n[i+2]:
    return True

【问题讨论】:

标签: python


【解决方案1】:

等价 到但不等于,因为访问只执行一次。 Python 自然地链接关系运算符(包括inis)。

显示细微差别的最简单方法:

>>> print(1) == print(2) == print(3)
1
2
3
True
>>> print(1) == print(2) and print(2) == print(3)
1
2
2
3
True

print()总是返回None,所以我们这里只是比较Nones,所以结果总是True,但是注意第二种情况,print(2)被调用了两次,所以我们在输出中得到两个2s,而在第一种情况下,结果用于两个比较,所以它只执行一次。

如果你使用没有副作用的纯函数,这两个操作最终会完全一样,但除此之外它们会有些不同。

【讨论】:

  • 值得注意的是,它们并不相同,因为可以设计一个工作而另一个失败的场景(n 是一个在访问后更改 n[i+1] 值的对象)。编辑:我在一个示例中进行了编辑以显示差异。
  • @GarethLatty 您的两个示例都返回 True。你不是要举一个假的例子吗?
  • @JoelBerkeley 在 7 年后,我花了一秒钟的时间才弄清楚我想在那里展示什么。关键是它们都返回相同的结果,但副作用不同:一个打印2两次。为了清楚起见,我添加了更多解释。
  • @GarethLatty 可以使一个为 False 另一个为 True,并在每次调用时更新一个对象。我觉得这至少和副作用一样重要。我可以添加一个例子
  • @JoelBerkeley 这只是另一个副作用的例子,但是是的,添加更多例子来澄清这一点并没有什么坏处。
【解决方案2】:

是的,但是,当比较被链接时,通用表达式被评估一次,当使用and 时,它被评估两次。在这两种情况下,如果第一个比较为假,则不会评估第二个比较,例如来自docs

比较可以任意链接,例如,x

【讨论】:

    【解决方案3】:

    正如其他人的回答,答案是肯定的。但是:小心添加括号。例如:

    >>> 1 == 2 == 0
    False
    >>> (1 == 2) == 0
    True
    

    在第二种情况下,(1 == 2) 计算结果为 False,然后 False == 0 计算结果为 True,因为 Python 允许将布尔值与整数进行比较。

    同样:

    >>> 0 == 0 == 1
    False
    >>> (0 == 0) == 1
    True
    

    【讨论】:

      【解决方案4】:

      是的,你是对的......

      你也可以这样做

      5 > x > 1
      

      1 < x < 5
      

      【讨论】:

        【解决方案5】:

        你可以使用集合来测试是否相等

        >>> a, b, c = 2, 2, 2
        >>> len({a, b, c}) == 1
        True
        >>> a, b, c = 2, 2, 3
        >>> len({a, b, c}) == 1
        False
        

        【讨论】:

          【解决方案6】:

          是的,在 python 的内部,比较运算符既不返回 true 也不返回 false,而是返回“比较结果”对象(不记得类名,这是过去的事了),并且这个对象提供了 _ lt__gt__eq_等等方法并对最终结果“负责”(并且“比较结果”在语句结束时转换为 True 或 False)。这是 python 提供给你的语义控制的魔力:)

          【讨论】:

            【解决方案7】:

            看来你也可以用 !=: 链接 ==:

            >>> a = b = c = 1
            >>> a == b == c
            True
            >>> a == b == c == 1
            True
            >>> a == b == c == 2
            False
            >>> a == b == c != 2
            True
            >>> a == b == c != 1
            False
            >>> 
            

            【讨论】:

              猜你喜欢
              • 2021-09-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-07
              • 2019-01-28
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多