这个问题已经在这里有一个答案:
我是做了本文给出了问题,而我有以下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))
,所以我直接在Python3.7控制台把((1, 3) or (3, 1))
,这就是输出
>>> ((1, 3) or (3, 1))
(1, 3)
但是,这仍然将没有任何意义,因为(1,3)确实是成对出现的。
任何人可以解释为什么把这些括号无效的声明?
一个Python or
表达式的结果是所述第一操作数是truthy,或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)
此外,两个操作数都truthy,所以表达式的计算结果,无论(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
元素的元素,所以使用上面的代码。