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
我正在做一个 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