73

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

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
4

7 回答 7

73

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

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

>>> 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,所以我们在None这里所做的只是比较 s,所以结果总是True,但是请注意,在第二种情况下,print(2)被调用了两次,所以我们2在输出中得到了两个 s,而在第一种情况下,使用了结果对于这两个比较,所以它只执行一次。

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

于 2012-12-10T17:27:57.123 回答
16

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

比较可以任意链接,例如,x < y <= z 等价于 x < y 和 y <= z,除了 y 只计算一次(但在这两种情况下,当找到 x < y 时根本不计算 z是假的)。

于 2012-12-10T17:31:56.617 回答
13

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

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

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

同样地:

>>> 0 == 0 == 1
False
>>> (0 == 0) == 1
True
于 2018-10-23T16:45:36.207 回答
6

是的,你是对的 ....

你也可以

5 > x > 1

或者

1 < x < 5
于 2012-12-10T17:28:12.007 回答
3

您可以使用集合来测试相等性

>>> a, b, c = 2, 2, 2
>>> len({a, b, c}) == 1
True
>>> a, b, c = 2, 2, 3
>>> len({a, b, c}) == 1
False
于 2018-12-04T13:01:44.950 回答
2

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

于 2012-12-10T17:42:11.627 回答
1

看来您也可以将 == 与 != 链接起来:

>>> 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
>>> 
于 2019-02-28T15:58:49.017 回答