Они всегда дают одинаковый результат.
Фактически, 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
в документации.not x in xs
ISnot (x in xs)
. Но тот факт, что он реализован путем анализа его в один и тот же байт-код,x not in xs
очень ясно показывает, что они всегда должны быть идентичными, в отличие от таких вещей, какnot x == y
vs,x != y
которые должны давать тот же результат, но не должны (в зависимости от реализаций__eq__
и__ne__
участвует).not in
что это предпочтительнее, потому что это более очевидно, и они добавили для этого специальный случай.источник
Они идентичны по смыслу, но программа проверки руководств по стилю Python pycodestyle (ранее называвшаяся pep8) предпочитает
not in
оператор в правиле E713 :См. Также «Python
if x is not None
илиif not x is None
?» за очень похожий выбор стиля.источник
Другие уже очень ясно дали понять, что эти два утверждения, вплоть до довольно низкого уровня, эквивалентны.
Однако я не думаю, что кто-то еще достаточно подчеркнул, что, поскольку это оставляет выбор за вами, вы должны
выберите форму, которая делает ваш код максимально читаемым.
И не обязательно быть максимально читаемым для всех , даже если это, конечно, хорошая вещь, к которой нужно стремиться. Нет, убедитесь, что код максимально удобочитаем для вас , поскольку именно вы, скорее всего, вернетесь к этому коду позже и попытаетесь его прочитать.
источник
В Python разницы нет. И нет никаких предпочтений.
источник
Синтаксически это одно и то же утверждение. Я бы поспешил заявить, что это
'ham' not in 'spam and eggs'
передает более ясное намерение, но я видел код и сценарии, в которыхnot 'ham' in 'spam and eggs'
передается более ясное значение, чем у других.источник