测试三个值的相等性

78

它们相等吗?

xs[i] == xs[i+1] == xs[i+2]
xs[i] == xs[i+1] and xs[i+1] == xs[i+2]

1
重复的问题:https://dev59.com/wWYr5IYBdhLWcg3wTYYQ#13792615 - Rushy Panchal
7个回答

81

Python自然地链式连接关系运算符(包括inis)。

a() == b() == c()在连续调用b返回相同的值且具有与单个调用b相同的聚合副作用时,与a() == b() and b() == c()在功能上是等效的。例如,当b是没有副作用的纯函数时,这两个表达式是没有区别的。

展示这种微小差异的最简单方法:

>>> 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,所以结果总是 True,但请注意,在第二种情况下,print(2) 被调用了两次,因此输出中会有两个 2,而在第一种情况下,结果用于两个比较,因此它只执行一次。


5
值得注意的是它们不同,因为可以构造一个场景,在这个场景中一个可行而另一个失败(n 是一个在访问后改变 n[i+1] 值的对象)。编辑说明:我已添加了一个例子以展示它们之间的区别。 - Gareth Latty
@GarethLatty 你的两个例子都返回True。难道你的意思是要举一个返回False的例子吗? - joel
@JoelBerkeley 我花了一点时间才明白我试图展示的内容,这已经持续了7年。关键是它们都返回相同的结果,但是副作用是不同的:一个会打印两次“2”。我添加了更多的解释来澄清这一点。 - Gareth Latty
@GarethLatty 可以通过一个在每次调用时更新的对象,使其中一个为False,另一个为True。我认为这比副作用至少同样重要。我可以添加一个示例。 - joel
@JoelBerkeley 这只是另一个副作用的例子,但是加入更多示例以澄清观点没有任何问题。 - Gareth Latty

18

是的,然而,当比较被链接时,公共表达式只会被计算一次。使用 and 时会计算两次。在两种情况下,如果第一个比较是假的,那么第二个比较就不会被计算。来自文档的例子:

比较可以任意链接,例如,x < y <= z 等同于 x < y and y <= z,除了 y 只会被计算一次(但在两种情况下,当发现 x < y 是假时,z 都不会被计算)。


17

正如其他人已经回答的那样,答案是肯定的。不过要注意:小括号的使用。例如:

>>> 1 == 2 == 0
False
>>> (1 == 2) == 0
True
在第二种情况下,(1 == 2) 的值为False,然后False == 0的值为True,因为Python允许将布尔值与整数进行比较。
同样:
>>> 0 == 0 == 1
False
>>> (0 == 0) == 1
True

7

是的,你说得对...

你也可以执行...

5 > x > 1

或者

1 < x < 5

3

您可以使用集合(set)来测试相等性。

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

2

是的,在Python的内部,比较运算符返回的不是真也不是假,而是返回“比较结果”对象(我已经记不起它的类名了,这是很久以前的事情),这个对象提供了_lt__gt__eq_等方法,并且成为最终结果的“负责人”(并且“比较结果”会在语句结束时转换为True或False)。这就是Python提供给您的语义控制的魔力 :)


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
>>> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接