8

我对 Python 如何评估布尔语句感到困惑。

例如。

False and 2 or 3

返回 3

这是如何评估的?我认为 Python 首先查看 'False and 2',然后返回 False 甚至不查看 'or 3'。Python在这里看到的顺序是什么?

另一个是:

1 or False and 2 or 2 and 0 or 0

返回 1

根据我从第一个示例中收集到的信息,我认为 Python 会从左到右进行计算,因此“1 或 False”将返回 1,然后“1 和 2”将返回 2,然后“2 或 2”将返回前 2 ,然后“2 和 0”将返回 0,然后“0 或 0”将返回第二个 0。

如您所知,我在这里很困惑,请帮忙!

谢谢!

4

5 回答 5

10

and的优先级高于or

False and 2 or 3

被评估为

((False and 2) or 3)

由于第一部分(False and 2)False,Python 必须评估第二部分以查看整个条件是否仍然可以变为True。它可以,因为3计算结果为True所以返回此操作数。

类似的1 or False and 2 or 2 and 0 or 0评估为

(1 or ((False and 2) or ((2 and 0) or 0)))

由于1计算结果为,因此无论其他操作数具有哪个值,True整个条件都是 。TruePython 可以在此时停止计算并再次返回确定最终值的操作数。

在确定最终结果时就停止称为短路评估,可描述如下:

每当确定表达式的最终结果时,就会停止计算,并在 Python 中返回确定最终值的操作数的值。也就是说,假设从左到右的评估:

  • 对于运算符,计算结果为(或最后一个)and的最左边的操作数False
  • 对于运算符,计算结果为(或最后一个)or的最左边的操作数True
于 2012-05-06T22:42:36.290 回答
3

这里的问题是有一个评估顺序,并且and优先级高于or. 因此,它们在这里从左到右进行评估。

鉴于此,False and 2 or 3对于 python,它是(False and 2) or 3- 所以它的计算结果是False or True,然后是True

在您的下一个示例中,Python 短路,因此1 or False评估为True一样1,因此返回1. 其余的永远不会被评估。这是有道理的,就好像 an 的一部分orTrue,你知道整个事情一定是 - 那么为什么还要费心做额外的工作呢?

检查这一点的一个好方法是定义打印的函数:

>>> def test(x):
...     print("Test: "+str(x))
...     return x
... 
>>> test(1) or test(0) or test(3)
Test: 1
1
>>> test(0) or test(0) or test(3)
Test: 0
Test: 0
Test: 3
3
>>> test(False) and test(2) or test(3)
Test: False
Test: 3
3
>>> test(1) or test(False) and test(2) or test(2) and test(0) or test(0)
Test: 1
1

这样可以很容易地查看评估的内容和顺序。

于 2012-05-06T22:42:04.177 回答
3

查看此页面的第 5.15 节:http: //docs.python.org/reference/expressions.html

or的优先级低于and,因此您的语句被评估为

(false and 2) or 3
于 2012-05-06T22:42:55.567 回答
2

我在 python 文档页面上读到了这个。如果我找到它,我会发布参考。它在布尔语句中陈述了类似的内容,Python 将返回第一个 True 对象。因此.... the and 被 False 预置为假,但 or 只有一个参数,即 3(真)。

于 2012-05-06T22:43:06.540 回答
2

它是这样评估的:

result = (False and 2) or 3

So basically if False and 2 is true-ish, then it is returned, otherwise 3 is returned.

于 2012-05-06T22:44:06.860 回答