Python的 - 为什么这些括号的if语句改变了实际情况? [重复]

问题描述 投票:-1回答:2

这个问题已经在这里有一个答案:

我是做了本文给出了问题,而我有以下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 if-statement parentheses
2个回答
1
投票

一个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

其结果是可以理解的错误。

如果去掉括号,你碰上的事实,orin优先级低。所以

(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

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

© www.soinside.com 2019 - 2024. All rights reserved.