"x not in y" or "not x in y"
Solution 1:
They always give the same result.
In fact, not 'ham' in 'spam and eggs'
appears to be special cased to perform a single "not in" operation, rather than an "in" operation and then negating the result:
>>> 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
I had thought at first that they always gave the same result, but that not
on its own was simply a low precedence logical negation operator, which could be applied to a in b
just as easily as any other boolean expression, whereas not in
was a separate operator for convenience and clarity.
The disassembly above was revealing! It seems that while not
obviously is a logical negation operator, the form not a in b
is special cased so that it's not actually using the general operator. This makes not a in b
literally the same expression as a not in b
, rather than merely an expression that results in the same value.
Solution 2:
- No, there is no difference.
The operator
not in
is defined to have the inverse true value ofin
.—Python documentation
- I would assume
not in
is preferred because it is more obvious and they added a special case for it.
Solution 3:
They are identical in meaning, but the pycodestyle Python style guide checker (formerly called pep8) prefers the not in
operator in rule E713:
E713: test for membership should be
not in
See also "Python if x is not None
or if not x is None
?" for a very similar choice of style.