python - Python:布尔运算符(和,或)不返回布尔值的理由
问题描述
[编辑:这个问题不是这个的重复;我在问一个语言设计的问题,即首先为什么会这样。我对它的行为方式并不感到困惑,我对为什么首先决定这种行为感到困惑。]
在 Python(和其他一些语言,例如 Lua)中,布尔运算符and
andor
不返回布尔值True
,False
正如人们所期望的那样,而是:
x or y
: 如果x
是假的,那么y
,否则x
x and y
如果x
为假,则x
,否则y
很容易看出,在特殊情况下 wherex
和y
are booleans 的行为符合预期。
我的问题是,以这种方式概括的实际理由是什么?我知道您可以将其用于以下技巧:
foo = x or None
或 DIY 三元运算符,如:
foo = x and y or z
但我觉得这些都不足以成为这种令人惊讶的行为的充分理由。每当我看到非布尔返回值被依赖于其实际值时(而不是在 if 语句或其他东西中,无论哪种方式都无关紧要),我总是必须仔细检查我对它的理解,因为我总是忘记它是如何工作的,我需要再次查找它。我通常更喜欢以更冗长的方式编写它。是否有它应该以这种方式工作的根本原因,或者它真的只是为了技巧?
解决方案
在 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”)的操作数。&&
||
推荐阅读
- javascript - 如何创建每个对象属性的数组?
- sql - Oracle SQL - 将值放大以达到所需的总数
- drupal - Drupal 8.6 Commerce:在没有 module_uninstall() 的 .install 文件中从数据库中删除表。为什么?
- javascript - react-native - Android 响应它应该的样式,但 IOS 没有
- typescript - 如果参数为空,则打字稿函数返回类型为空
- spring-boot - 使用@Builder Lombok 的超类字段
- java - 为什么我们需要枚举常量方法之外的方法,尽管我们已经为每个常量提供了不同的方法?
- azure - 未找到应用程序 - Azure 区块链工作台
- java - 单词相似度“n字母差异”的正则表达式
- java - 如何创建一个返回唯一随机数的函数?