Python:布尔运算符(和、或)不返回布尔值的理由

dai*_*ain 0 python boolean language-design comparison-operators

[编辑:这个问题不是这个问题的重复;我问的是语言设计的问题,即为什么它首先是这样的。我对它的行为方式并不感到困惑,我对为什么首先决定这种行为感到困惑。]

在Python(以及其他一些语言,例如Lua)中,布尔运算符andor并不像人们所期望的那样返回布尔值TrueFalse而是:

  • x or y:如果x为假,则y,否则x
  • x and y如果x为 false,则x,否则y

很容易看出,在xy是布尔值的特殊情况下,其行为符合预期。

我的问题是,以这种方式进行概括的实际理由是什么?我知道你可以用它来实现以下技巧:

foo = x or None
Run Code Online (Sandbox Code Playgroud)

或者 DIY 三元运算符,例如:

foo = x and y or z
Run Code Online (Sandbox Code Playgroud)

但我觉得这些都不足以为这种令人惊讶的行为提供充分的理由。每当我看到非布尔返回值被依赖于其实际值(而不是在 if 语句或其他东西中,无论哪种方式都无关紧要),我总是必须仔细检查我对它的理解,因为我总是忘记它是如何工作的,我需要再次查找它。我通常更喜欢以更详细的方式编写。是否有一个根本原因为什么它应该以这种方式工作,或者它真的只是为了技巧?

Tim*_*ers 7

就 Python 而言,该bool类型直到该语言发布十多年后才存在。如果它从一开始就存在,也许and会有or不同的定义。但是,事实上,向后兼容性要重要得多。来自介绍该类型的PEP

兼容性要求的另一个结果是表达式“True and 6”的值为 6,类似地,表达式“False or None”的值为 None。“and”和“or”运算符被有效地定义为返回决定结果的第一个参数,并且这一点不会改变;特别是,它们不会强制结果为布尔值。当然,如果两个参数都是布尔值,则结果始终是布尔值。通过编写“bool(x and y)”,也可以轻松地将其强制转换为 bool。

编辑:顺便说一句,Python 一开始的目的是“弥合”“数据丰富”语言(如 Unixy shell)和“方便”语言(如 Unixy shell)编程之间的C差距。Python 的和更像shell 语言,从左到右消耗所有且仅需要解析整个链是否成功(“true”)或失败(“false”)的操作数。shcshandor&&||