运算符返回最后评估的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条件不是基于Bbut的真实性X,它可以是从简单值到复杂表达式的任何内容)。
但是,您需要小心,因为正如 JaredGoguen 在他的回答中指出的那样,将 OP 示例中的 更改or为 anelse实际上会改变代码的行为。该代码的编写取决于or操作员的这种特定行为。您不能只用or条件表达式替换 for 赋值的任何使用。可能还需要额外的重构。