Python if x is not Nonelub if not x is None?
TLDR: Kompilator kodu bajtowego analizuje je oba x is not None- więc ze względu na czytelność użyj if x is not None.
Czytelność
Używamy Pythona, ponieważ cenimy takie rzeczy, jak czytelność dla człowieka, użyteczność i poprawność różnych paradygmatów programowania nad wydajnością.
Python optymalizuje czytelność, szczególnie w tym kontekście.
Analiza i kompilacja kodu bajtowego
Że not wiąże się słabiej niżis , więc nie ma tu różnicy logicznej. Zobacz dokumentację :
Operatorzy isiis not test tożsamości obiektu: x is yjest prawdą, jeśli i tylko wtedy, gdy xiy są tym samym obiektem. x is not ydaje odwrotną wartość prawdy.
Jest is notto specjalnie przewidziane w Pythonie gramatyce jako poprawa czytelności dla języka:
comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'
Jest to więc również element gramatyki.
Oczywiście nie jest tak samo parsowane:
>>> import ast
>>> ast.dump(ast.parse('x is not None').body[0].value)
"Compare(left=Name(id='x', ctx=Load()), ops=[IsNot()], comparators=[Name(id='None', ctx=Load())])"
>>> ast.dump(ast.parse('not x is None').body[0].value)
"UnaryOp(op=Not(), operand=Compare(left=Name(id='x', ctx=Load()), ops=[Is()], comparators=[Name(id='None', ctx=Load())]))"
Ale wtedy kompilator bajtów faktycznie przetłumaczy not ... isnais not :
>>> import dis
>>> dis.dis(lambda x, y: x is not y)
1 0 LOAD_FAST 0 (x)
3 LOAD_FAST 1 (y)
6 COMPARE_OP 9 (is not)
9 RETURN_VALUE
>>> dis.dis(lambda x, y: not x is y)
1 0 LOAD_FAST 0 (x)
3 LOAD_FAST 1 (y)
6 COMPARE_OP 9 (is not)
9 RETURN_VALUE
Więc ze względu na czytelność i używanie języka zgodnie z przeznaczeniem, proszę użyć is not .
Nie używać tego nie jest mądre.
is notjest operatorem sam w sobie. Jak!=. Jeśli wolisz,not x is Noneto należy również swoje woląnot a == bponada != b.