Python-为什么if语句中的这些括号会更改实际条件?

时间:2019-02-07 03:44:00

标签: python if-statement parentheses

当我有以下python代码时,我在做一个leetcode问题:

pairs = [(1, 3)]
addend = 3
sum = 4
if ((addend, sum - addend) or (sum - addend, addend)) in pairs:
    print("Pair exists")

我运行这段代码的预期输出应该是

Pair exists

但是,它不会打印任何内容,我认为这意味着((addend, sum - addend) or (sum - addend, addend))的计算结果为False

然后我删除了外圆括号并将其制成

if (addend, sum - addend) or (sum - addend, addend) in pairs:
        print("Pair exists")

这给了我正确的输出。

我的第二个猜测是这对多余的括号实际上计算出((addend, sum - addend) or (sum - addend, addend)),所以我将((1, 3) or (3, 1))直接放在Python3.7控制台中,这就是输出

>>> ((1, 3) or (3, 1))
(1, 3)

但这仍然没有意义,因为(1,3)实际上是成对的。

有人可以解释为什么加上这些括号会使语句无效吗?

2 个答案:

答案 0 :(得分:1)

您应该使用any

if any(i in pairs for i in [(addend, sum-addend),(sum-addend,addend)]):

或使用:

if (addend, sum - addend) in pairs or (sum - addend, addend) in pairs:

您不能使用or,因为or只是选择了一个元素,而实际上并不是pairs中的元素,因此请使用上面的代码。

答案 1 :(得分:1)

Python or表达式的结果是第一个为真的操作数,如果没有,则为False

您尝试的第一个表达式是

((addend, sum - addend) or (sum - addend, addend)) in pairs

可以评估为

((3, 1) or (1, 3)) in pairs

由于括号中or表达式的两个操作数都是非空元组,因此该表达式的计算结果为

(3, 1) in pairs

结果是错误的。

如果删除括号,则会遇到or的优先级低于in的事实。所以

(addend, sum - addend) or (sum - addend, addend) in pairs

相同
(3, 1) or ((1, 3) in pairs)

同样,两个操作数都是真实的,因此无论(3, 1)是否包含任何内容,表达式的求值为pairs

您可能想表达的是

(addend, sum - addend) in pairs or (sum - addend, addend) in pairs