wenn A vs wenn A nicht ist None:
Kann ich verwenden:
if A:
statt
if A is not None:
Letztere scheint so ausführlich. Gibt es einen Unterschied?
InformationsquelleAutor der Frage rbairos | 2011-10-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Aussage
rufen
A.__nonzero__()
(siehe Spezielle Methode Namen Dokumentation) und mit der return-Wert der Funktion. Hier ist die Zusammenfassung:Auf der anderen Seite,
vergleicht nur die Referenz
A
mitNone
zu sehen, ob es die gleiche ist oder nicht.InformationsquelleAutor der Antwort Greg Hewgill
Wie geschrieben PEP8:
InformationsquelleAutor der Antwort scraplesh
Viele Funktionen geben Keine, wenn es keine entsprechenden Ergebnisse. Zum Beispiel, ein SQLAlchemy Abfrage
.first()
Methode gibt Keine, wenn es keine Zeilen in der Ergebnismenge. Angenommen, Sie wählen einen Wert zurückgeben kann 0 und müssen wissen, ob es wirklich 0 ist, oder ob die Abfrage hatte überhaupt keine Ergebnisse.Einer gemeinsamen Sprache zu geben, die eine Funktion oder Methode ist optionales argument, das den Standard-Wert "None", und dann zu testen, ob der Wert als None, um zu sehen, wenn es angegeben wurde. Zum Beispiel:
vergleichen:
In der letzteren, was passiert, wenn Sie anrufen
spam(0)
oderspam([])
? Die Funktion würde (fälschlicherweise) zu erkennen, dass Sie nicht hatte, übergeben Sie einen Wert füreggs
würde und berechnen Sie ein default-Wert für Sie. Das ist wahrscheinlich nicht das, was Sie wollen.Oder stellen Sie sich eine Methode wie "return die Liste der Buchungen für ein bestimmtes Konto". Wenn das Konto nicht vorhanden ist, ist es vielleicht Keine Rückkehr. Das ist etwas anderes als Rückgabe eine leere Liste (was bedeuten würde: "dieses Konto existiert, aber nicht aufgezeichneten Transaktionen).
Schließlich zurück zu Datenbank-Zeug. Es gibt einen großen Unterschied zwischen NULL und einem leeren string. Eine leere Zeichenfolge in der Regel sagt "es gibt hier einen Wert, und dieser Wert ist gar nichts". NULL sagt: "dieser Wert wurde nicht eingegeben."
In jedem dieser Fälle, die Sie benutzen wollen würde
if A is None
. Sie überprüft die für einen bestimmten Wert - Keine - nicht nur "irgendein Wert, der passiert, zu werfen, um False".InformationsquelleAutor der Antwort Kirk Strauser
so ist es nicht dasselbe wie
InformationsquelleAutor der Antwort Abdul Muneer
wenn Ein: wird sich als falsch, wenn A ist 0, False oder None, das kann zu unerwünschten Resultaten führen.
InformationsquelleAutor der Antwort keflavich
Meisten guides, die ich gesehen habe, vorschlagen, dass Sie verwenden sollten,
wenn Ein:
es sei denn, Sie einen Grund haben, um genauer zu sein.
Gibt es einige leichte Unterschiede. Es gibt andere Werte als "None", False zurück, zum Beispiel leere Listen, oder 0, also ein denken über das, was es ist, du bist wirklich testen.
InformationsquelleAutor der Antwort Colin Coghill
Sie die unterschiedlichsten Dinge tun,.
Den unten überprüft, ob Sie Eine hat alles, außer die Werte
False
[]
None
''
und0
. Es prüft die Wert von A.Den unten überprüft, ob Ein ist ein anderes Objekt als gar Keine. Er prüft und vergleicht die Referenz (memory-Adresse) Einer und Keiner.
UPDATE: Weitere Erklärung
Viele Male die beiden scheinen das gleiche zu tun, so viele Leute verwenden diese abwechselnd - das ist eine wirklich schlechte Idee. Der Grund, warum die beiden den gleichen Ergebnissen führen, ist viele Male durch pure Zufall aufgrund von Optimierungen der interpreter/compiler wie Praktikum oder etwas anderes.
Mit diesen Optimierungen im Sinn, ganze zahlen und strings mit dem gleichen Wert am Ende mit dem gleichen Speicherplatz. Das erklärt wahrscheinlich, warum zwei separate Zeichenfolgen handeln, als ob Sie identisch sind.
Andere Dinge, die sich nicht so Verhalten, das gleiche aber..
Den beiden Listen haben eindeutig Ihren eigenen Speicher. Überraschend Tupel Verhalten sich ähnlich wie strings.
Wahrscheinlich ist dies, weil Tupel sind garantiert nicht ändern, so macht es Sinn, die Wiederverwendung der gleichen Speicher.
Bottom line ist, dass Sie können nicht Sie verlassen sich auf Zufälle. Nur weil es quakt wie eine Ente, es bedeutet nicht, dass es eine Ente ist. Verwenden
is
und==
je nachdem, was Sie wirklich wollen, um zu überprüfen. Diese Dinge können schwer zu Debuggen, dais
liest sich wie Prosa, die wir oft nur überfliegen.InformationsquelleAutor der Antwort Pithikos
Es hängt vom Kontext ab.
Benutze ich
if A:
wenn ich erwarteA
eine Art der Sammlung, und ich möchte nur das ausführen blockieren, wenn die collection nicht leer ist. Dies ermöglicht es dem Anrufer zu übergeben, das gut erzogene Sammlung, leer oder nicht, und haben es das tut, was ich erwarte. Es ermöglicht auchNone
undFalse
zu unterdrücken Ausführung des Blocks, die gelegentlich bequem zu den Aufruf-code.OTOH, wenn ich erwarte, dass
A
werden einige völlig willkürlich Objekt, aber es hätte vorgegebenNone
ich dann immer verwendenif A is not None
wie der Aufruf-code haben könnte absichtlich übergeben einen Verweis auf eine leere Sammlung, leere Zeichenfolge oder einen 0-Wert hat einen numerischen Typ oder booleanFalse
oder einige Klasse-Instanz, die passiert werden false, boolean-Kontext.Und auf der anderen Seite, wenn ich erwarte, dass
A
einige weitere-spezifische Sache (z.B. Instanz einer Klasse werde ich Methoden aufrufen), aber es hätte vorgegebenNone
und ich halte default boolean Umstellung auf eine Eigenschaft der Klasse, die ich nicht Verstand Durchsetzung auf alle Unterklassen, dann werde ich nur verwendenif A:
zu sparen, meine Finger die schreckliche Last für die Eingabe eines zusätzlichen 12 Zeichen.InformationsquelleAutor der Antwort Ben
None ist ein besonderer Wert in Pythondie in der Regel bezeichnet eine nicht initialisierte variable. Um zu testen, ob nicht dieser bestimmten Wert, den Sie verwenden:
Falsey Werte sind eine spezielle Klasse von Objekten in Python (z.B. false, []). Um zu testen, ob Eine ist falsey verwenden:
So, die beiden Ausdrücke sind nicht das gleiche Und würde Sie besser behandeln Sie nicht als Synonyme.
P. S. Keiner ist auch falsey, so ist der erste Ausdruck impliziert die zweite. Aber das zweite betrifft andere falsey Werte außer None. Nun... wenn Sie sicher sein können, dass Sie nicht haben, andere falsey Werte außer None, dann ersetzen Sie den ersten Ausdruck mit dem zweiten.
InformationsquelleAutor der Antwort mircealungu
Ersteres ist mehr Pythonic (besser ideomatic code), aber führt nicht den block, wenn A Falsch ist (nicht gar Keiner).
InformationsquelleAutor der Antwort Borealid
python >= 2.6,
wenn wir schreiben, wie
generiert eine Warnung,
So können wir
InformationsquelleAutor der Antwort normalUser
Ich habe eine Datei namens
test.py
und lief es auf den Dolmetscher. Sie können ändern, was Sie wollen, um zu testen, für sicher, wie die Dinge gehen hinter den kulissen.Dies ist der assembler Unterschied:
Quelle:
InformationsquelleAutor der Antwort user