Python 中的 or/and 运算符究竟如何表现? [重复]

问题描述 投票:0回答:3

Python 究竟如何计算由多个 and/or 运算符连接的语句?

当我在 Python 中运行以下语句时:

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

输出为

[1]

但是对于以下声明,

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

输出为

(1,)

我很困惑。是什么导致这两个语句的输出存在差异?这里的评估顺序是什么?

python conditional-statements logical-operators
3个回答
2
投票

它们并非严格从左到右进行评估:

and
or 具有
更高的优先级
(结合更紧密)。所以你的例子是这样评估的:

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

[1]
是“true”,因此根本不会评估括号中的表达式。
[1]
是第一个
or
的结果。同样,第二个
or

另一个:

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

[]
是“假”,因此括号中的表达式 is 被计算。
[1]
是真实的,所以
and
继续评估
(1,)
,这也是真实的,
and
的结果也是如此。因为
(1,)
为真,所以不会评估第二个
or
的第二部分,
(1,)
是最终结果。

请注意,“未评估”就是它所说的意思。例如,

>>> [] or [1] and (1,) or 1/0
(1,)

我们没有遇到被零除异常,因为

1/0
部分从未被求值 -
or
的左操作数已经确定了最终结果。


-1
投票

“or” 运算符中,当其中一个条件为真时,返回 “True” 如果两个条件都为假,则返回 “False”

所以你的第一个条件是: 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.

"and" 运算符中,当两个条件都为 true 时,它返回 "True" 如果其中一个条件为 false,则返回 "False"

你的第二个条件也一样 [] 或 1 和 (1,) 或 ()

Note: T for "True" F for "False"

作为参考,您可以通过此链接


-1
投票

[] 和 (1,):and 运算符首先计算 [],它被认为是 False(空列表)。根据短路计算,由于左操作数为 False,Python 不会计算右操作数 (1,)。相反,它返回 []。

[1] 或 []:由于左操作数 [1] 被视为 True(非空列表),Python 会短路或运算符并返回 [1]。

因此,总的来说,表达式 [1] 或 [] 和 (1,) 或 () 的计算结果为 [1]。

print([1] or [] and (1,) or ())  # Output: [1]

然而,另一方面,该表达式同时涉及 and 和 or 运算符。为了正确计算这个表达式,我们需要了解这些运算符的优先级以及 Python 如何计算涉及它们的表达式。

在Python中,and运算符的优先级高于or运算符。当表达式中存在多个“and”和“or”运算符时,Python 遵循 从左到右 计算顺序。

让我们一步步分解这个表达式:

[1] 和 (1,):由于 [1] 和 (1,) 都被视为 True(分别为非空列表和非空元组),因此 and 运算返回第二个操作数,即 (1,) 。 [] 或 (1,):由于左操作数 [] 被视为 False(空列表),因此 Python 计算右操作数 (1,)。 or 运算返回第二个操作数,即 (1,)。 (1,) 或 ():(1,) 和 () 都被视为 True(分别为非空元组和非空元组)。 or 运算短路并返回第一个操作数,即 (1,)。 因此,总的来说,表达式的计算结果为 (1,)。

print([] or [1] and (1,) or ())  # Output: (1,)
© www.soinside.com 2019 - 2024. All rights reserved.