Python if x is not None
oder if not x is None
?
TLDR: Der Bytecode-Compiler analysiert beide, x is not None
um 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 is
und der is not
Test auf Objektidentität: x is y
ist genau dann wahr, wenn x und y dasselbe Objekt sind. x is not y
ergibt den inversen Wahrheitswert.
Das is not
ist 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 ... is
in 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 not
ist ein eigenständiger Betreiber. Wie!=
. Wenn Sie es vorziehen ,not x is None
dann sollte Ihr auch liebernot a == b
übera != b
.