Diese Frage hat hier schon eine Antwort:
Gibt es einen Unterschied zwischen diesen drei in einem bestimmten Szenario? wenn es keinen Unterschied gibt, welcher besser geeignet ist?
%Vor%und
%Vor%und
%Vor%sind gleich im Falle von Keine Variable?
Gibt es einen Unterschied zwischen diesen drei in einem bestimmten Szenario?
Der erste fragt, ob die Variable etwas Falsches ist. Dieser Test wird für alle möglichen Dinge außer None
- False
, 0
, jede leere Sequenz usw. fehlschlagen.
Die zweite fragt, ob es sich um die magische Singleton-Konstante None
handelt. Dies wird nur für None
selbst fehlschlagen.
Der dritte fragt, ob es sich um etwas handelt, das sich für None
hält. Dies wird zum Beispiel für Holder(None)
fehlschlagen, wobei Holder
eine Wrapper-Klasse ist, deren Instanzen sich mit dem vergleichen, was sie gerade halten. Oder, um ein weniger realistisches, aber kürzeres Beispiel zu geben:
Der letzte ist selten nützlich; in der Tat, wenn Sie jemals denken, dass Sie == None
oder != None
überprüfen müssen, und Sie nicht explizit transparent-Wrapper-Klassen oder ähnliches erstellt haben, wollten Sie wahrscheinlich tatsächlich is None
oder is not None
. Aber die anderen beiden sind beide sehr nützlich und üblich.
wenn es keinen Unterschied gibt, welcher besser geeignet ist?
Nun, dort ist ein Unterschied, und welcher ist geeigneter, hängt von der spezifischen Verwendung ab.
Am Ende der Frage scheint es, als würden Sie fragen, ob es einen Unterschied in dem speziellen Fall gibt, in dem Variable
definitiv None
ist. In diesem Fall gibt es natürlich keinen funktionalen Unterschied zwischen den dreien. Alle sind garantiert falsch und tun daher nichts. Das bedeutet, dass es auch keinen Unterschied zwischen den dreien gibt und überhaupt keinen Code schreibt. Das ist viel einfacher, lesbarer und schneller.
* Es gibt einen Leistungsunterschied - der erste muss nicht LOAD_CONST
the None
haben oder einen Vergleichsoperator aufrufen. Und selbst wenn es Ihnen irgendwie gelungen ist, None
zu binden oder den Wert der None
-Konstante zu ändern (vielleicht, indem Sie den gesamten Heap mit ctypes
stampfen?), Funktioniert die erste wahrscheinlich noch immer. Aber beides wird niemals eine Rolle spielen - und wenn sie es wieder tun, wird kein Code noch schneller und zuverlässiger sein.
not x
wird wahr, wenn x
ist None
, False
, []
, {}
usw.
x is not None
wird immer True
sein, es sei denn, eine Variable ist tatsächlich None
.
Bearbeiten:
Dies ist von praktischer Bedeutung, wenn Sie überprüfen möchten, ob eine Variable tatsächlich auf einen geeigneten Wert eingestellt ist. Sonst kann es zu Problemen kommen. Zum Beispiel, wenn Sie eine Liste von Elementen auswerten möchten und tun:
%Vor%Um zu überprüfen, ob eine Liste bereitgestellt wurde, wird die Bedingung auf einer leeren Liste ausgelöst, die möglicherweise noch eine gültige Eingabe ist. In diesem Fall sollten Sie dies mit
überprüfen %Vor%, um leere Listen als gültige Eingaben zuzulassen, aber immer noch prüfen, ob überhaupt eine Liste bereitgestellt wurde.
Der None
-Wert als solcher ist vergleichbar mit einem null
oder nil
-Wert in bestimmten Sprachen. Es ist ein Platzhalter für das Fehlen eines Wertes in einer definierten Variable (wenn es nicht definiert ist, wird ein NameError
geworfen). Deshalb wird in einigen Fällen der Wert None
als Standardwert verwendet:
Es wird auch häufig als Standardwert für optionale Variablen verwendet:
%Vor% Auf diese Weise ist 0
immer noch ein gültiger Wert, der zu False
ausgewertet wird, wenn er mit if not bar:
überprüft wird.
Die offizielle PEP 8-Empfehlung sollte mit Keine getestet werden eine Identitätsprüfung:
%Vor%Der Gleichheits- / Ungleichheitstest würde auch funktionieren, wäre aber langsamer und nicht idiomatisch:
%Vor%Das Testen des booleschen Werts der Variable führt zu einem anderen Ergebnis. Der folgende Test würde "Hallo Welt" drucken, wenn die Variable ein leerer Container oder eine Zahl gleich Null wäre:
%Vor%Tags und Links python comparison