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

Python - Why these parentheses in if-statement alters the real condition?

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

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) 确实是成对的。

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

你应该使用 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 中的元素,所以使用上面的代码。

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)

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

你想表达的可能是

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