Python中的或/和运算符具体是如何工作的?

-1 投票
3 回答
59 浏览
提问于 2025-04-12 16:02

Python是怎么处理用多个“与”(and)和“或”(or)连接的语句的呢?

当我在Python中运行下面这条语句:

[1] or [] and (1,) or ()

输出是 [1]

但是对于下面这条语句,

[] or [1] and (1,) or ()

输出是 (1,)

我有点困惑。为什么这两条语句的输出会不一样呢?它们的计算顺序是怎样的?

3 个回答

-1

"或"运算符中,只要有一个条件为真,就会返回"真";如果两个条件都为假,就返回"假"

所以对于你的第一个条件:"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

首先来看这个表达式中的“[]”和“(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,)
3

它们的计算顺序不是严格从左到右的: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 的左边的部分已经决定了最终的结果。

撰写回答