运算符返回最后评估的or
参数,它可能是也可能不是布尔值。
文档中解释了此行为:
请注意,既不限制and
也不or
限制它们返回的值和类型False
,True
而是返回最后评估的参数。这有时很有用,例如,如果s
字符串为空,则应将其替换为默认值,则表达式会s or 'foo'
产生所需的值。
当然,记住什么被解释为假和什么被解释为真的会有所帮助:
[T]以下值被解释为假:False
, None
, 所有类型的数字零,以及空字符串和容器(包括字符串、元组、列表、字典、集合和冻结集)。所有其他值都被解释为 true。
所以在表达式中:
A = B or C
正如@MartijnPieters 在评论中指出的那样,or
表达式短路。如果第一个参数(B
在这种情况下)被解释为真,则整个表达式必须为真,因此第二个参数(C
)永远不会被计算。因此,第一个参数 ( B
) 是“最后评估的参数”并且是返回的内容。但是,如果第一个参数 ( B
) 被解释为假,则C
仍必须评估第二个参数 ( ) 以确定表达式的真实性(不会发生短路)。在这种情况下,“最后计算的参数”是第二个参数 ( C
),无论表达式的计算结果是真还是假,都会返回它。
它有效地完成了与条件表达式相同的操作:
A = B if B else C
但是,条件表达式仅在 2.5 版中添加到 Python 中,而布尔运算符的行为从一开始就存在(或者至少存在很长时间)。大多数经验丰富的 Python 程序员很容易识别并习惯使用A = B or C
. 条件表达式通常保留用于更复杂的条件,这些条件不适用于简单的条件or
(例如,A = B if X else C
条件不是基于B
but的真实性X
,它可以是从简单值到复杂表达式的任何内容)。
但是,您需要小心,因为正如 JaredGoguen 在他的回答中指出的那样,将 OP 示例中的 更改or
为 anelse
实际上会改变代码的行为。该代码的编写取决于or
操作员的这种特定行为。您不能只用or
条件表达式替换 for 赋值的任何使用。可能还需要额外的重构。