Python中的或/和运算符具体是如何工作的?
Python是怎么处理用多个“与”(and)和“或”(or)连接的语句的呢?
当我在Python中运行下面这条语句:
[1] or [] and (1,) or ()
输出是 [1]
。
但是对于下面这条语句,
[] or [1] and (1,) or ()
输出是 (1,)
。
我有点困惑。为什么这两条语句的输出会不一样呢?它们的计算顺序是怎样的?
3 个回答
在"或"运算符中,只要有一个条件为真,就会返回"真";如果两个条件都为假,就返回"假"。
所以对于你的第一个条件:"1 或 [] 和 (1,) 或 ()"
When you separate the conditions one-by-one as:
**[1] or []**
It returns true as one of the condition is true.
with second condition in this
**[] and (1,)**
It will return false as one condition is true but it uses and operator.
with the third condition in this
**(1,) or ()**
It will return true as one of the condition is true.
If you put all the conditions together:
**"[1] or [] and (1,) or ()"**
We can expand it like
**"T or F and T"**
It will return **"True"** as it satisfied the **or** operator.
在"和"运算符中,只有当两个条件都为真时,才会返回"真";如果有一个条件为假,就会返回"假"。
你的第二个条件也是一样:[] 或 1 和 (1,) 或 ()
注意:T代表"真",F代表"假"
你可以参考一下这个链接。
首先来看这个表达式中的“[]”和“(1,)”。在这里,and操作符会先检查“[]”,因为它是一个空列表,所以被认为是False。根据短路原则,既然左边的值是False,Python就不会再去看右边的“(1,)”了,直接返回“[]”。
接下来是“[1] or []”。这里左边的“[1]”是一个非空列表,所以被认为是True。Python会直接返回这个True的值,也就是“[1]”。
所以,总的来说,表达式“[1] or [] and (1,) or ()”的结果是“[1]”。
print([1] or [] and (1,) or ()) # Output: [1]
不过,这个表达式里同时用了and和or操作符。为了正确理解这个表达式,我们需要知道这些操作符的优先级,以及Python是怎么处理它们的。
在Python中,and操作符的优先级比or操作符高。当一个表达式里有多个and和or时,Python会按照从左到右的顺序来计算。
我们一步一步来分析这个表达式:
首先是“[1] and (1,)”。因为“[1]”和“(1,)”都是非空的,所以它们都被认为是True。and操作符会返回第二个值,也就是“(1,)”。
接着是“[] or (1,)”。这里左边的“[]”是空列表,被认为是False,所以Python会去看右边的“(1,)”。or操作符会返回第二个值,也就是“(1,)”。
最后是“(1,) or ()”。这两个都是非空的元组,所以or操作符会直接返回第一个值,也就是“(1,)”。
所以,整体来看,这个表达式的结果是“(1,)”。
print([] or [1] and (1,) or ()) # Output: (1,)
它们的计算顺序不是严格从左到右的:and
的优先级比 or
高(也就是说,and
的计算会更紧密一些)。所以你的例子是这样计算的:
[1] or ([] and (1,)) or ()
[1]
是“真值”,所以括号里的表达式根本不被计算。[1]
是第一个 or
的结果。第二个 or
也是一样。
另一个例子:
[] or ([1] and (1,)) or ()
[]
是“假值”,所以括号里的表达式 会 被计算。[1]
是真值,所以 and
会继续计算 (1,)
,而 (1,)
也是真值,因此 and
的结果也是真值。因为 (1,)
是真值,第二个 or
的第二部分就不会被计算了,最终结果就是 (1,)
。
注意,“没有被计算”就是字面意思。举个例子:
>>> [] or [1] and (1,) or 1/0
(1,)
我们没有遇到除以零的错误,因为 1/0
这一部分根本没有被计算——or
的左边的部分已经决定了最终的结果。