Они всегда дают одинаковый результат.
Фактически, not 'ham' in 'spam and eggs'
кажется, что он предназначен для выполнения одной операции "не в", а не для операции "в" и затем отрицания результата:
>>> 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
, а не просто выражение, которое приводит к тому же значению.
not x in xs
в документации.