您误解了布尔表达式的工作原理;它们不像英语句子那样工作,并且猜测您在这里谈论的是对所有名称的相同比较。您正在寻找:
if x == 1 or y == 1 or z == 1:
x
and y
否则将自行评估(False
if 0
, True
否则)。
您可以使用遏制测试来缩短时间a tuple:
if 1 in (x, y, z):
或者更好的是:
if 1 in {x, y, z}:
using a set利用恒定成本会员资格测试(即in
无论左侧操作数是什么,都需要固定的时间)。
解释
当你使用or
,python 将运算符的每一侧视为separate表达式。表达方式x or y == 1
被视为第一个布尔测试x
,那么如果这是 False,则表达式y == 1
经测试。
这是因为运算符优先级. The or
运算符的优先级低于==
测试,因此评估后者first.
然而,即使这是not案例和表达式x or y or z == 1
实际上被解释为(x or y or z) == 1
相反,这仍然不会达到您期望的效果。
x or y or z
将评估第一个“真实”的参数,例如不是False
、数字 0 或空(请参阅布尔表达式有关 Python 在布尔上下文中认为 false 的详细信息)。
所以对于价值观x = 2; y = 1; z = 0
, x or y or z
将决心2
,因为这是参数中第一个类似 true 的值。然后2 == 1
将会False
, 虽然y == 1
将会True
.
这同样适用于相反的情况;针对单个变量测试多个值;x == 1 or 2 or 3
也会因为同样的原因而失败。使用x == 1 or x == 2 or x == 3
or x in {1, 2, 3}
.