1. ホーム
  2. python

[解決済み] "x not in y "または "not x in y "です。

2022-10-18 11:13:26

質問

メンバーシップのテストを行う場合、以下のような方法があります。

x not in y

あるいは、その代わりに

not x in y

この式には、以下のような様々なコンテキストが考えられます。 xy . それは例えば、部分文字列のチェック、リストメンバーシップ、dictキーの存在などのためかもしれません。

  • 2 つの形式は常に同等ですか?
  • 望ましい構文はありますか?

どのように解決するのですか?

いつも同じ結果になってしまいます。

実際には 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 と同じで、単に同じ値になる式というだけではありません。