Python 究竟如何计算由多个 and/or 运算符连接的语句?
当我在 Python 中运行以下语句时:
[1] or [] and (1,) or ()
输出为
[1]
。
但是对于以下声明,
[] or [1] and (1,) or ()
输出为
(1,)
。
我很困惑。是什么导致这两个语句的输出存在差异?这里的评估顺序是什么?
它们并非严格从左到右进行评估:
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
的左操作数已经确定了最终结果。
在 “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,):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,)