if a == b or a == c: vs if a in {b, c}:

Leo*_*ark 5 python

在我的代码中,我曾经if a == b or a == c or a == d:经常进行比较。在某些时候,我发现这些可以很容易地缩短为if a in {b, c, d}:或者if a in (b, c, d):如果值不可哈希。但是,我从未在其他任何人的代码中看到过这样的结构。这可能是因为:

  1. ==方法比较慢。
  2. ==方法是更Python。
  3. 他们实际上做了微妙不同的事情。
  4. 我碰巧也没有看过任何需要的代码。
  5. 我见过它,只是忽略或忘记了它。
  6. 人们不应该需要进行这样的比较,因为其他地方的代码应该会更好。
  7. in除了我,没有人想过办法。

如果有,是哪个原因?

Eug*_*ash 5

对于简单值(即不是表达式或NaNs),if a == b or a == cif a in <iterable of b and c>是等价的。

如果值是可散列的,最好使用in集合文字而不是元组或列表文字:

if a in {b, c}: ...
Run Code Online (Sandbox Code Playgroud)

CPython 的窥孔优化器通常能够用缓存frozenset()对象替换它,并且针对集合的成员资格测试是 O(1) 操作。

  • 吹毛求疵:它们并不完全等同,尽管在实践中发生的许多情况下它们可能是可以互换的。考虑“a = b = c = float('nan')”的情况:“a == b or a == c”是“False”,而“a in {b, c}”是“True”。 (5认同)