'Variable' oder 'Variable ist nicht keine' [duplizieren]

8
    

Diese Frage hat hier schon eine Antwort:

    
%Vor%

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?

    
NIlesh Sharma 27.03.2013, 05:23
quelle

4 Antworten

8
  

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:

%Vor%

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.

    
abarnert 27.03.2013, 05:56
quelle
6

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:

%Vor%

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.

    
Stjepan Bakrac 27.03.2013 05:25
quelle
3

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%     
Raymond Hettinger 27.03.2013 06:23
quelle
1

Sie sind anders. not überprüft, ob bool(var) zu False ausgewertet wird.

zB

%Vor%

if x is None überprüft, ob x None selbst ist.

    
jamylak 27.03.2013 05:26
quelle

Tags und Links