首页 > 解决方案 > Python:布尔运算符(和,或)不返回布尔值的理由

问题描述

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

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

很容易看出,在特殊情况下 wherexyare booleans 的行为符合预期。

我的问题是,以这种方式概括的实际理由是什么?我知道您可以将其用于以下技巧:

foo = x or None

或 DIY 三元运算符,如:

foo = x and y or z

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

标签: pythonbooleanlanguage-designcomparison-operators

解决方案


在 Python 的例子中,这种bool类型甚至在语言发布十多年后才存在。如果它从一开始就存在,也许and并且or会有不同的定义。但是,实际上,向后兼容性要重要得多。从引入类型的 PEP中:

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

编辑:顺便说一句,一开始,Python 旨在“弥合”在“数据丰富”语言C(如 Unixy shell(、、等)等)编程和“方便”语言sh之间的“鸿沟” csh。Python 的andand更像or是在 shell 语言中运行,从左到右消耗所有且仅需要解析整个链是成功(“true”)还是失败(“false”)的操作数。&&||


推荐阅读