当我有以下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
中的元素,所以使用上面的代码。