2013-03-27 14 views
8
Variable = None 

Gibt es einen Unterschied zwischen diesen drei in einem bestimmten Szenario? wenn es keinen Unterschied gibt, welcher besser geeignet ist?'Variable' oder 'Variable ist nicht keine'

if Variable: 
print "Hello world" 

und

if Variable is not None: 
print "Hello world" 

und

if Variable != None: 
print "Hello world" 

sind gleiche bei None Variable?

+0

Vielleicht verwechselt er 'wenn x None' und' wenn x == None' – jamylak

+0

ja, Recht. Danke für die Erinnerung –

+0

Dies sollte geschlossen werden, es ist entweder keine echte Frage oder ein Duplikat. http: // Stapelüberlauf.com/questions/3257919/is-none-vs-none http://stackoverflow.com/questions/7816363/if-a-vs-if-a-is-not-none – jamylak

Antwort

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 Arten von Dingen scheitern neben None-False, 0, jede leere Sequenz usw.

Die zweite Frage, ob es die Magie Singleton konstant None ist. Dies wird nur für None selbst fehlschlagen.

Die dritte fragt, ob es sich um None handelt. Dies wird zum Beispiel für Holder(None) fehlschlagen, wobei Holder eine Wrapper-Klasse ist, deren Instanzen gleich sind, was auch immer sie halten. Oder, um ein weniger realistisches aber kürzeres Code-Beispiel zu geben:

class Stupid(object): 
    def __ne__(self, other): 
     return False 
Variable = Stupid() 

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 speziell transparente Wrapper-Klassen oder ähnliches erstellt haben, wollten Sie wahrscheinlich eigentlich is None oder is not None. Aber die anderen beiden sind beide sehr nützlich und üblich.

Wenn es keinen Unterschied gibt, welcher ist besser geeignet?

Nun, es ist ein Unterschied, und welches ist besser geeignet, hängt von der spezifischen Anwendung.

Am Ende der Frage scheint es, als ob Sie fragen könnten, 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 der None, oder rufen Sie einen Vergleichsoperator. 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. Aber beides wird niemals eine Rolle spielen - und wenn sie es wieder tun, wird kein Code noch schneller und zuverlässiger sein.

6

not x wird wahr sein, wenn xNone ist, False, [], {} usw.

x is not None immer True sein, es sei denn, eine Variable tatsächlich None ist.

Edit:

Dies ist von praktischer Bedeutung, wenn Sie, ob eine Variable überprüfen mögen tatsächlich auf einen geeigneten Wert eingestellt ist. Sonst kann es zu Problemen kommen. Zum Beispiel, wenn Sie eine Liste der Elemente bewerten wollen und zu tun:

if not x: 

zu überprüfen, ob eine Liste zur Verfügung gestellt wurde, dann ist die Bedingung auf eine leere Liste ausgelöst wird, die immer noch eine gültige Eingabe sein kann. Also in diesem Fall würden Sie mit überprüfen, wie

if x is not None: 

zu leeren Listen als gültige Eingaben zu erlauben, aber immer noch den Fall prüfen, dass keine Liste überhaupt zur Verfügung gestellt wurde.

Der Wert None als solcher ist vergleichbar mit einem null oder nil Wert in bestimmten Sprachen. Es ist ein Platzhalter für das Fehlen eines Wertes in einem definierten Variablen (wenn es nicht definiert ist, wird es ein NameError werfen). Deshalb ist der None Wert als Standardwert in einigen Fällen verwendet:

>>> def foo(): 
...  pass 
... 
>>> x = foo() 
>>> x is None 
True 

ist es auch als Standardwert für optionale Variablen häufig verwendet:

>>> def foo(bar=None): 
...  if bar is None: 
...   print('No argument passed.') 
...  else: 
...   print('Variable bar: %s' % str(bar)) 
... 
>>> foo(0) 
Variable bar: 0 
>>> foo() 
No argument passed. 

diese Weise 0 ist immer noch ein gültiger Wert , das würde False bewerten, wenn es mit if not bar: überprüft wird.

+0

Benennungs-Nitpick: Wenn die Variable nicht definiert ist, ist 'if x ist nicht None' immer noch ein' NameError', genau wie 'falls nicht x'. (Sie möchten vielleicht eine Art von Voreinstellung beschreiben- to-'None' Kontext, um es einfacher zu machen, dies auf eine einfache Weise zu erklären, ohne irreführend zu sein?) – abarnert

+0

Danke, die Antwort bearbeitet. –

1

Sie sind anders. not prüft, ob bool(var)-False auswertet.

z.

>>> not '' 
True 
>>> not 'abc' 
False 
>>> not 0 
True 

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

3

Die official PEP 8 recommendation ist für Keine mit einer Identitätsüberprüfung zu testen:

if Variable is not None: 
    print "Hello world" 

Die Gleichheit/Ungleichheit Test auch funktionieren würde, aber langsamer und nicht-idiomatische sein:

if Variable != None: 
    print "Hello world" 

Testing Der boolesche Wert der Variablen ergibt ein anderes Ergebnis. Der folgende Test würde „Hallo Welt“, wenn die Variable waren ein leerer Behälter oder eine Zahl gleich Null drucken:

# Hello world won't print for any of these values: 
for Variable in(), '', u'', {}, [], 0, 0.0, 0j, None: 
    if Variable: 
     print "Hello world" 
Verwandte Themen