dai*_*ain 0 python boolean language-design comparison-operators
[编辑:这个问题不是这个问题的重复;我问的是语言设计的问题,即为什么它首先是这样的。我对它的行为方式并不感到困惑,我对为什么首先决定这种行为感到困惑。]
在Python(以及其他一些语言,例如Lua)中,布尔运算符and
和or
并不像人们所期望的那样返回布尔值True
,False
而是:
x or y
:如果x
为假,则y
,否则x
x and y
如果x
为 false,则x
,否则y
很容易看出,在x
和y
是布尔值的特殊情况下,其行为符合预期。
我的问题是,以这种方式进行概括的实际理由是什么?我知道你可以用它来实现以下技巧:
foo = x or None
Run Code Online (Sandbox Code Playgroud)
或者 DIY 三元运算符,例如:
foo = x and y or z
Run Code Online (Sandbox Code Playgroud)
但我觉得这些都不足以为这种令人惊讶的行为提供充分的理由。每当我看到非布尔返回值被依赖于其实际值(而不是在 if 语句或其他东西中,无论哪种方式都无关紧要),我总是必须仔细检查我对它的理解,因为我总是忘记它是如何工作的,我需要再次查找它。我通常更喜欢以更详细的方式编写。是否有一个根本原因为什么它应该以这种方式工作,或者它真的只是为了技巧?
就 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”)的操作数。sh
csh
and
or
&&
||
归档时间: |
|
查看次数: |
772 次 |
最近记录: |