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



当我有以下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(确实是成对的。

谁能解释一下为什么把这些括号放在这些括号里会使声明无效?

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

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

最新更新