「x in y」または「not x in y」


97

メンバーシップをテストする場合、以下を使用できます。

x not in y

または代わりに:

not x in y

xとに応じて、この式には多くのコンテキストが考えられますy。たとえば、部分文字列チェック、リストメンバーシップ、dictキーの存在などが考えられます。

  • 2つの形式は常に同等ですか?
  • 推奨される構文はありますか?

回答:


112

彼らは常に同じ結果を与えます。

実際、not 'ham' in 'spam and eggs'「in」操作ではなく結果を否定するのではなく、単一の「not in」操作を実行する特殊なケースのように見えます。

>>> import dis

>>> def notin():
    'ham' not in 'spam and eggs'
>>> dis.dis(notin)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               7 (not in)
              9 POP_TOP             
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE    

>>> def not_in():
    not 'ham' in 'spam and eggs'
>>> dis.dis(not_in)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               7 (not in)
              9 POP_TOP             
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE    

>>> def not__in():
    not ('ham' in 'spam and eggs')
>>> dis.dis(not__in)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               7 (not in)
              9 POP_TOP             
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE        

>>> def noteq():
    not 'ham' == 'spam and eggs'
>>> dis.dis(noteq)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               2 (==)
              9 UNARY_NOT           
             10 POP_TOP             
             11 LOAD_CONST               0 (None)
             14 RETURN_VALUE      

最初はそれらが常に同じ結果notを与えると思っていましたが、それ自体は単に優先順位の低い論理否定演算子でありa in b、他のブール式と同じように簡単に適用できnot in、便宜と明確さのために別の演算子でした。

上記の分解が明らかになりました!一方でいるようだnot、明らかに論理否定演算子であり、形はnot a in b特別に、それは実際に一般的な演算子を使用していないようにケースに入れています。これにより、同じ値になる式だけではなく、not a in b文字通りと同じ式a not in bになります。


4
これは実装の詳細にすぎないことに注意してください。not x in xsドキュメントでの言及も見つかりません。
phant0m 2012年

1
@ phant0m絶対に。あなたが考えることになっている方法not x in xsIS not (x in xs)。しかし、それは次のように正確に同じバイトコードにそれを解析することによって実現していますという事実x not in xsのようなものとは対照的に、彼らは、常に同じでなければならないことを非常に明確に示したnot x == yx != yこれは、必要があり、同じ結果を与えるが、(の実装に依存する必要はありません__eq____ne__関与)。
ベン

11
CPythonののぞき穴最適化を実行しました。JythonやIronPythonなどの他のPython実装が自由に無視またはコピーできるコンパイル時の最適化(言語仕様の一部ではありません)。
Martijn Pieters

15

  1. いいえ、違いはありません。

    演算子not inは、の逆の真の値を持つように定義されていますin

    Pythonドキュメント

  2. not inそれはより明白であり、彼らはそれのために特別なケースを追加したので、私は好ましいと思います。



3

他の人たちはすでに、2つのステートメントが非常に低いレベルまで同等であることを明確にしています。

しかし、これはあなたに選択を任せているので、あなたがすべきことをまだ強調している人はまだいないと思います

コードをできるだけ読みやすくするフォームを選択してください。

そして、もちろんそれが狙いとしては良いことだとして、必ずしもにでも読みやすいとは限りません。いいえ。コードができるだけ読みやすくなるようにしてください。あなたが後でこのコードに戻って読んでみる可能性が最も高いのはあなただからです。


大規模なチームで作業している場合や、しばらくの間手つかずになる可能性のあるコードで作業している場合は、誰かがそれを維持する必要がある可能性が高くなります。
トミーハーバート


1

構文的には同じです。私は'ham' not in 'spam and eggs'より明確な意図を伝えることをすぐに述べますが、私はnot 'ham' in 'spam and eggs'他のものより明確な意味を伝えるコードとシナリオを見てきました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.