Python if x is not Noneoder if not x is None?
TLDR: Der Bytecode-Compiler analysiert beide, x is not Noneum die Lesbarkeit zu verbessern if x is not None.
Lesbarkeit
Wir verwenden Python, weil wir Dinge wie die menschliche Lesbarkeit, Benutzerfreundlichkeit und Korrektheit verschiedener Paradigmen der Programmierung gegenüber der Leistung schätzen.
Python optimiert die Lesbarkeit, insbesondere in diesem Zusammenhang.
Analysieren und Kompilieren des Bytecodes
Das not bindet schwächer als is, daher gibt es hier keinen logischen Unterschied. Siehe die Dokumentation :
Die Operatoren isund der is notTest auf Objektidentität: x is yist genau dann wahr, wenn x und y dasselbe Objekt sind. x is not yergibt den inversen Wahrheitswert.
Das is notist in der Python- Grammatik speziell als Lesbarkeitsverbesserung für die Sprache vorgesehen:
comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'
Und so ist es auch ein einheitliches Element der Grammatik.
Natürlich wird es nicht gleich analysiert:
>>> 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())]))"
Aber dann übersetzt der Byte-Compiler das tatsächlich not ... isin is 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
Um die Lesbarkeit zu verbessern und die Sprache so zu verwenden, wie sie beabsichtigt war, verwenden Sie bitte is not.
Es nicht zu benutzen ist nicht klug.
is notist ein eigenständiger Betreiber. Wie!=. Wenn Sie es vorziehen ,not x is Nonedann sollte Ihr auch liebernot a == bübera != b.