Python中逻辑运算符与in结合时返回值类型差异问题:为何部分语句返回布尔值,部分返回字符串?
Python中
and/or返回值差异的原因拆解 这事儿得从Python里and和or的短路求值特性说起——它们和你熟悉的其他语言里的逻辑运算符不一样,不是只会返回布尔值,而是直接返回参与运算的实际操作数,结果类型完全取决于操作数本身!
先搞懂两个核心规则
Python里的and和or都是短路求值,意思是只要能确定结果,就不会继续计算后面的表达式:
and的规则:从左到右判断,若第一个操作数在布尔上下文中是False(比如空字符串、0、None),直接返回它;否则返回第二个操作数。or的规则:同样从左到右,若第一个操作数在布尔上下文中是True(比如非空字符串、非零数字),直接返回它;否则返回第二个操作数。
另外要注意:in运算符的优先级比and/or高,所以会先执行x in y的判断,再进行逻辑运算。
针对你的例子逐一解析
先看目标字符串:
string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua"
1. print("Lorem" and "aliqua" in string) 返回True
拆解步骤:
- 先算优先级更高的
"aliqua" in string:目标字符串末尾确实有aliqua,所以结果是布尔值True。 - 表达式简化为
"Lorem" and True。 - 因为
"Lorem"是非空字符串,在布尔上下文中是True,所以and返回第二个操作数True——最终打印布尔值。
2. print("Lorem" or "aliqua" in string) 返回"Lorem"
拆解步骤:
- 同样先算
"aliqua" in string,得到True。 - 表达式简化为
"Lorem" or True。 - 因为
"Lorem"是布尔真值,or会直接返回第一个操作数(短路,不用管后面的True)——所以最终打印字符串"Lorem"。
补充:什么时候会返回布尔值?
如果逻辑运算的其中一个操作数本身是布尔值,或者最后落到布尔值上,才会返回布尔类型。比如:
"" and "aliqua" in string:空字符串是False,直接返回""(字符串类型)。"Lorem" and "":第一个是真值,返回第二个操作数""(字符串类型)。"" or "aliqua" in string:第一个是False,返回"aliqua" in string的结果True(布尔类型)。
内容的提问来源于stack exchange,提问作者Ankit Chaurasia
相关产品推荐
相关产品推荐

