评估数字表达式

3 投票
3 回答
785 浏览
提问于 2025-04-17 06:42

有人能解释一下为什么在计算数字表达式时,Python会返回最后一个被计算的结果吗?

举个例子:

3 and 5

这个表达式的结果是

5

我还有一个问题,为什么它会计算这些表达式呢?当我尝试检查时:

3 == True

我得到的是 False,但当我计算:

3 and 5

结果是 5,显然(我觉得)它认为 3 是 True,因为如果它认为不是的话,就不会继续计算了(我可能错了)。

相对来说,当我计算:

0 and 3

我得到的是 0,我认为发生的事情是 Python 检查 0 是否为 True,结果判断不是,然后就输出了这个结果。

抱歉如果这些听起来有点混乱,但我在书里碰到这个问题,想知道我是不是漏掉了什么。

3 个回答

0

布尔运算是怎么工作的

可以查看关于布尔运算的文档。它们的工作原理如下:

  • a or b会返回第一个被判断为True的元素,比如在0 or 3的情况下,它会返回3;在3 or 5的情况下,它也会返回3
  • a and b会返回第一个被判断为False的元素,如果所有元素都被判断为True,那么就返回最后一个元素。所以0 and 3会返回0,而3 and 5会返回5

解决方案

不过你的问题是有解决办法的。只需使用bool()将结果转换为布尔值:

>>> bool(0 or 3)
True
>>> bool(3 or 5)
True
>>> bool(0 and 3)
False
>>> bool(3 and 5)
True

这样有帮助吗?

编辑:

另一种解决方案

其实我觉得在你的情况下,可能还有更好的解决办法。看看这个:

  • bool(a or b)可以用any([a, b])来替代,
  • bool(a and b)可以用all([a, b])来替代。

我现在认为这是一种更合理的解决方案。

2

来自Python参考资料:

The expression x and y first evaluates x; if x is false, its value is returned;
otherwise, y is evaluated and the resulting value is returned.

如果你说的是

0 and 5

那么第一个被计算的值(0)会被返回。

对于第二个问题,3在当作布尔值时显然是“真”,但是==这个运算符在比较之前并不会把它的参数转换成布尔值。

3

在Python中,任何值都可以分为“真值”和“假值”。除了0以外,所有整数都是“真值”。使用布尔运算符orand时,Python会返回它最后计算的表达式。例如,3 or 5会返回3,因为Python首先判断3是“真值”,所以不需要再计算5,直接返回3。

0 and 5中,0是“假值”,所以Python不会继续计算下一个表达式,直接返回0。

至于5 == True返回False的原因是,5并不等于True,它在布尔表达式中只是表现得像“真值”。而bool(5) == True返回True,因为这条语句明确地把整数转换成了布尔值。

撰写回答