为什么在Python中`(True, True, True) == True, True, True`不是True?

16

代码片段1:

a = True, True, True
b = (True, True, True)

print(a == b)

返回 True

代码片段2:

(True, True, True) == True, True, True

返回 (False, True, True)


这相当于 ((1, 1, 1) == 1),1,1 - pylang
2个回答

29

运算符优先级。在你的第二个代码片段中,实际上是在检查(True, True, True)True之间的相等性,然后使用该结果作为第一项构建了一个元组。

请记住,在Python中,通过指定逗号分隔的“列表”项而不使用任何括号,可以返回一个元组:

>>> a = True, True, True
>>> print(type(a))
<class 'tuple'>
>>> print(a)
(True, True, True)

代码片段2也不例外。您正在尝试使用相同的语法构建元组,只是第一个元素是(True,True,True) == True,第二个元素是True,第三个元素是True

因此,代码片段2等效于:

(((True, True, True) == True), True, True)

由于(True,True,True) == True是False(您在此处比较了一个包含三个对象的元组和布尔值),因此第一个元素变为False。


哦,你能解释一下它如何返回 (False, True, True) 吗? - Nandu Raj
2
@NanduRaj 已添加到答案中,但基本上您正在将布尔元组与布尔本身进行比较。仅因为元组中的所有值都是真值,并不意味着表达式本身为真 :) (如果您想要检查,可以使用 all((True, True, True)) - TerryA
@NanduRaj 因为代码片段2最终只是构建元组的表达式。第一个元素是False(因为比较结果),第二个元素是True(因为这是指定的),第三个元素也是True(和第二个元素的原因相同)。 - TerryA
2
@MoHuss 是的,又是运算符优先级问题。这相当于 (True, True, (True == True), True, True) - TerryA
1
@MoHuss,你可以通过以下方式实现:a = True, True, True; b = True, True, True。现在a == b将返回True - iamvegan
显示剩余2条评论

5
这与Python中表达式的求值方式有关。 在第一种情况中,ab 都是元组。
a = True, True, True
b = (True, True, True)

print(type(a))
print(type(b))

print(a == b)

输出:

<class 'tuple'>
<class 'tuple'>
True

因此,它们被视为元组进行比较,实际上它们的值是相等的。

但对于情况2,它从左到右进行评估。

(True, True, True) == True, True, True

首先将元组(True, True, True)与仅有的True进行比较,结果为False

1
为什么输出的第二个元素是 True - Nandu Raj
因为已经有一个True了。最后两个True会按照它们本来的值进行计算。最终输出是一个元组。 - Zabir Al Nazi

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