Вони завжди дають однаковий результат.
Насправді, 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
в документації.