它们相等吗?
xs[i] == xs[i+1] == xs[i+2]
xs[i] == xs[i+1] and xs[i+1] == xs[i+2]
它们相等吗?
xs[i] == xs[i+1] == xs[i+2]
xs[i] == xs[i+1] and xs[i+1] == xs[i+2]
Python自然地链式连接关系运算符(包括in
和is
)。
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
,而在第一种情况下,结果用于两个比较,因此它只执行一次。
n
是一个在访问后改变 n[i+1]
值的对象)。编辑说明:我已添加了一个例子以展示它们之间的区别。 - Gareth Latty是的,然而,当比较被链接时,公共表达式只会被计算一次。使用 and
时会计算两次。在两种情况下,如果第一个比较是假的,那么第二个比较就不会被计算。来自文档的例子:
比较可以任意链接,例如,x < y <= z 等同于 x < y and y <= z,除了 y 只会被计算一次(但在两种情况下,当发现 x < y 是假时,z 都不会被计算)。
正如其他人已经回答的那样,答案是肯定的。不过要注意:小括号的使用。例如:
>>> 1 == 2 == 0
False
>>> (1 == 2) == 0
True
在第二种情况下,(1 == 2)
的值为False
,然后False == 0
的值为True
,因为Python允许将布尔值与整数进行比较。>>> 0 == 0 == 1
False
>>> (0 == 0) == 1
True
是的,你说得对...
你也可以执行...
5 > x > 1
或者
1 < x < 5
您可以使用集合(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
是的,在Python的内部,比较运算符返回的不是真也不是假,而是返回“比较结果”对象(我已经记不起它的类名了,这是很久以前的事情),这个对象提供了_lt_、_gt_、_eq_等方法,并且成为最终结果的“负责人”(并且“比较结果”会在语句结束时转换为True或False)。这就是Python提供给您的语义控制的魔力 :)
看起来你也可以使用 != 与 == 进行链式操作:
>>> 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
>>>