【问题标题】:Comparison operators give different values for | & compared to and or - Python [duplicate]比较运算符为 | 提供不同的值& 与和或相比 - Python [重复]
【发布时间】:2018-03-08 21:17:58
【问题描述】:

我对比较运算符感到困惑。例如,

 10 or 20 == 20
 # output, expected True
 10

  10 | 20 == 20
 (10 | 20) == 20
 (10 or 20) == 20

所有 3 行代码都给出 'False',但我期待的是 'True'。

 10 or 20 == 20
 # output gives 10, but was expecting True
 10

另一个例子:

 10 and 20 > 2
 # output is as expected
 True

 (10 and 20) > 2
 True

 (10 & 20) > 2
 # output gives False, but was expecting True
 False

最后,如果我这样做:

 10 or 20 > 100
 #output is 10. No idea why
 10
 3 or 8 < 200
 3

谁能帮助解决这个困惑?非常感谢您花时间阅读我的困惑!我正在使用 Python 3.6

【问题讨论】:

  • 只需单独打印每个表达式,然后您就会了解它们组合的逻辑。例如,(10 or 20) 是 10,但 (10 | 20) 是 30。
  • 10 &amp; 20 按位计算and,所以01010 &amp; 10100(二进制)确实是00000,不大于2

标签: python conditional-operator comparison-operators


【解决方案1】:

这两个条件运算符都会返回他们必须评估的最后一个条件或值。

or 运算符评估其中任何一个条件是否为真,并返回它评估的最后一个。由于10 在 Python(或任何其他语言)中被视为True,因此该语言甚至不会通过第二个条件(或值)而只返回第一个值。而在and 的情况下,两个条件都必须为真,如果两者都为真,则返回第二个值,否则返回第一个。

>>> True or False
True
>>> False or True
True
>>> True and False
False

# Similarly
>>> 10 or 20
10
>>> 10 and 20
20
>>> 0 or 10
10
>>> 0 and 10
0

此行为还为某些b = a if a else c 行为提供了一种方便的替代方案。

【讨论】:

  • 感谢 hspandher,但老实说,我发现逻辑违反直觉。我不认为说10 or 20 == 20 并期望True 而不是10 是不合理的。如果只评估第一个数字,那么比较链运算符有什么意义,即(10 or 20 or 30) &gt; 15 它给出False ,而不是10
  • @MichaelRSF 这种行为可能有一定的弊端,但事实证明它通常很方便。我不知道我用这个东西作为if-else 构造的方便替代品有多少次了。
【解决方案2】:

类似于真假情况:

>>> 20 or 10
20
>>>(20 or 10) == 10 
False
>>>(20 or 10) == 20
True

这是因为它将第一个值作为真,下一个作为假,当你传递真或假时,你得到同样的真值,你得到 20,它在这里实际上代表真。 希望这可以帮助。

【讨论】:

  • 感谢 user8477766。我的问题是,如果每次只使用== 运算符评估/比较第一个数字,那么进行链比较运算符似乎几乎毫无意义。还不如只做(20) == 10True 不要听起来很自大,但我个人不喜欢它背后的“逻辑”。似乎不比True or False == TrueTrue 好。在事先知道输出的情况下运行代码毫无意义。
  • @MichaelRSF 你的例子似乎毫无意义,因为它毫无意义。当您链接比较时,输入不会重新评估,这就是a &lt; b() &lt; c 优于a &lt; b() and b() &lt; c 的原因。但不清楚为什么你认为你可以这样使用or|,也许另见stackoverflow.com/questions/15112125/…
猜你喜欢
  • 2023-04-08
  • 2016-11-12
  • 2011-03-10
  • 2015-04-28
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多