“4 和 5”是 5,“4 或 5”是 4。有啥原因吗? [复制]

Posted

技术标签:

【中文标题】“4 和 5”是 5,“4 或 5”是 4。有啥原因吗? [复制]【英文标题】:"4 and 5" is 5, while "4 or 5" is 4. Is there any reason? [duplicate]“4 和 5”是 5,“4 或 5”是 4。有什么原因吗? [复制] 【发布时间】:2014-02-10 12:30:15 【问题描述】:

当我测试andor 之间的区别时,我遇到了这个问题。你能帮我理解一下吗?

【问题讨论】:

与其他一些语言不同,Python 中的 andor 运算符不返回布尔值。 有关关键字的帮助,例如and,你可以在控制台输入help("and"),这解释了andor返回的内容。 【参考方案1】:

是的,and 运算符要求所有参数为真,并返回最后一个检查的参数,即 5。(如果任何参数为假,它将返回第一个假值,因为那将是最后一个检查是为了验证所有参数是否为真。)

or 运算符只需要一个参数为真,并返回最后一个检查的参数,即 4,因为 4 表示条件中的第一个真值。 (如果所有参数都是假的,那么返回值将等于最后一个假值,因为这将是最后一个检查的值,以验证任何参数是否为真。)

【讨论】:

而这里的白话就是“短路”。在这种情况下,or 短路。如果左侧操作数为 Falsey,and 也可以短路。【参考方案2】:
true1 and true2 >>>true2
true1 or true2 >>>true1

在运行 true1 和 true2 时,python 必须检查每个表达式返回的值是否为真,所以它会返回最后一个。

但在运行 true1 或 true2 时,因为 true1 已经返回“true”(在您的示例中,4 为“true”),因此无需继续检查其余部分。

【讨论】:

【参考方案3】:

这种行为是一个奇怪的怪癖,它来自 python 代码的三个不同特性。非零值是真、逻辑运算评估和短路。我将在下面解释这些功能:

非零值为真

在评估这些表达式时,您首先要知道的是它们是逻辑运算符。它们旨在处理真值或假值:

true and true = true
true and false = false
false and true = false
false and false = false

true or true = true
true or false = true
false or true = true
false or false = false

但是,python(和许多语言)允许您输入任何值。只要它们不为零,它们就被认为是正确的。所以:

4 and 5 = true
4 and 0 = false

到目前为止这是正常的。大多数语言都有这个。

逻辑运算评估

在这里,Python 做了一些独特的事情。它实际上返回它在语句中检查的最后一项的值,而不是返回 true 或 false。所以:

4 and 5 = 5 (which will be evaluated as true)

要完全了解实际返回的值,您还必须了解:

短路

在评估这些逻辑运算符时,编译器通常会提前停止。举个例子:

3 or 4

我们知道该语句将返回 true,但它会返回哪个值?要弄清楚这一点,您必须了解哪个值将是最后一个被查看的值。系统将查看 3,并意识到该陈述是正确的。第二个值是什么并不重要,3 or anything 是真的。所以返回的值是 3,因为它是最后检查的值。

但是,如果我们使用 and:

3 and 4

一旦我们看到 3,我们仍然需要检查第二个值是否为真。它可以有所作为。因此评估第二个值。如果为真,则返回最后查看的值,在本例中为 4。

结论

您只需要考虑解释器可以停止在哪个值上。

3 or 4 = 3 // because we can stop at 3
3 and 4 = 4 // because we have to check the 4
0 or 3 = 3 // because we needed to check the 3

【讨论】:

【参考方案4】:

我认为看待它的方式是在一个更简单的层面上,这是为优化而设计的。

and 要求双方都是“真实的”。它检查左侧。如果它是“真实的”,它会返回第二个值而不检查它是什么

or 只要求一侧是“真实的”。它检查第一面。如果它是“真实的”,它会返回它。如果不是,它返回第二面,再次不检查它

对于“4 和 5”,因为 4 是“真实的”,所以它返回 5。 对于“4 或 5”,它甚至不看 5 就返回 4。

需要证明吗?制作这些函数:

def four():
    print 'Evaluating four!'
    return 4

def five():
    print 'Evaluating five!'
    return 5

现在看看打印了什么:

>>> four() and five()
Evaluating four!
Evaluating five!
5

and 评估了four(),因为它是真的,所以它返回了five()

>>> left() or right()
Evaluating left side!
4

or 评估了four(),因为它是真的,所以返回了four() 甚至没有调用five()

【讨论】:

以上是关于“4 和 5”是 5,“4 或 5”是 4。有啥原因吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何将Powershell版本从3.0升级到4.0或5.0

ueditor php版 编辑器 上传图片和视频出现报错’服务器返回出错’ 大哥大姐知道是啥原

为啥 clickhouse 'DESCRIBE TABLE' 返回 4 或 5 列

qt+vs2010,在qt下调试有些单元设置断点进不去,会是啥原

递增动态原型使 XCode 4.5.1 崩溃

首先为 iPhone 4 或 5 开发 [关闭]