Zawsze dają ten sam wynik.
W rzeczywistości not 'ham' in 'spam and eggs'
wydaje się być specjalnie oznaczony wielkością liter, aby wykonać pojedynczą operację „nie w”, a nie operację „w”, a następnie zanegować wynik:
>>> 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
Na początku myślałem, że zawsze dawały ten sam wynik, ale sam not
w sobie był po prostu logicznym operatorem negacji o niskim priorytecie, który można było zastosować a in b
tak samo łatwo jak każde inne wyrażenie logiczne, podczas gdy not in
był oddzielnym operatorem dla wygody i przejrzystości .
Demontaż powyżej był odkrywczy! Wygląda na to, że chociaż not
jest to oczywiście operator logiczny negacji, formularz not a in b
ma specjalną wielkość liter, więc w rzeczywistości nie używa operatora ogólnego. Daje to not a in b
dosłownie to samo wyrażenie a not in b
, a nie tylko wyrażenie, które daje tę samą wartość.
not x in xs
w dokumentacji.