Ich habe Python studiert und ein Kapitel gelesen, das den None
Wert beschreibt , aber leider ist dieses Buch an einigen Stellen nicht sehr klar. Ich dachte, ich würde die Antwort auf meine Frage finden, wenn ich sie dort teile.
Ich möchte wissen, was der None
Wert ist und wofür Sie ihn verwenden.
Und außerdem verstehe ich diesen Teil des Buches nicht:
Das Zuweisen eines Werts von
None
zu einer Variablen ist eine Möglichkeit, sie auf ihren ursprünglichen, leeren Zustand zurückzusetzen.
Was bedeutet das?
Die Antworten waren großartig, obwohl ich die meisten Antworten aufgrund meiner geringen Kenntnisse der Computerwelt nicht verstand (ich habe nichts über Klassen, Objekte usw. gelernt). Was bedeutet dieser Satz?
Das Zuweisen eines Werts von
None
zu einer Variablen ist eine Möglichkeit, sie auf ihren ursprünglichen, leeren Zustand zurückzusetzen.
Finale:
Schließlich habe ich meine Antwort erhalten, indem ich nach verschiedenen Antworten gesucht habe. Ich muss all die Menschen schätzen, die sich die Zeit genommen haben, mir zu helfen (insbesondere Martijn Pieters und DSM), und ich wünschte, ich könnte alle Antworten als die besten auswählen, aber die Auswahl ist auf eine beschränkt. Alle Antworten waren großartig.
quelle
None
ist kein leerer Standardzustand für Variablen.undef
. auch wohl Javascript, obwohl es sowohlnull
und hatundefined
.undefined
, wenn sie nicht initialisiert wird.null
, den ich @MartijnPieters in seiner Antwort nicht vorstelle.Antworten:
Martijns Antwort erklärt, was
None
in Python enthalten ist, und gibt zu Recht an, dass das Buch irreführend ist. Da würden Python-Programmierer in der Regel nie sagenEs ist schwer zu erklären, was Briggs auf sinnvolle Weise bedeutet und warum hier niemand damit zufrieden zu sein scheint. Eine Analogie, die helfen kann:
In Python sind Variablennamen wie Aufkleber auf Objekten. Auf jedem Aufkleber ist ein eindeutiger Name geschrieben, und es kann immer nur ein Objekt gleichzeitig sein. Sie können jedoch auch mehr als einen Aufkleber auf dasselbe Objekt kleben, wenn Sie möchten. Wenn du schreibst
Sie kleben den Aufkleber "F" auf ein Zeichenfolgenobjekt
"fork"
. Wenn du dann schreibstSie verschieben den Aufkleber auf das
None
Objekt.Briggs bittet Sie, sich vorzustellen, dass Sie den Aufkleber nicht geschrieben haben
"F"
, dass bereits einF
Aufkleber auf dem AufkleberNone
war und Sie ihn nur von nach verschoben haben . Wenn Sie also tippen , "setzen Sie es auf seinen ursprünglichen, leeren Zustand zurück", wenn wir uns entschieden haben, es als Bedeutung zu behandeln .None
"fork"
F = None
None
empty state
Ich kann sehen, worauf er hinaus will, aber das ist eine schlechte Sichtweise. Wenn Sie Python starten und eingeben
print(F)
, sehen Sieund das
NameError
bedeutet, dass Python den Namen nicht erkenntF
, weil es keinen solchen Aufkleber gibt . Wenn Briggs Recht und warenF = None
zurückgesetztF
in seinen ursprünglichen Zustand, dann sollte es nun sein, und wir sollten sehen ,wie wir es tun, nachdem wir
F = None
den Aufkleber getippt und aufgeklebt habenNone
.Das ist alles was los ist. In Wirklichkeit enthält Python einige Aufkleber, die bereits an Objekten angebracht sind (integrierte Namen), andere müssen Sie selbst mit Zeilen wie
F = "fork"
undA = 2
und schreibenc17 = 3.14
, und Sie können sie später auf andere Objekte kleben (wieF = 10
oderF = None
; es ist alles das Gleiche .)Briggs gibt vor, dass alle möglichen Aufkleber, die Sie schreiben möchten, bereits auf dem
None
Objekt kleben.quelle
None
ist nur ein Wert, der üblicherweise verwendet wird, um "leer" oder "hier kein Wert" zu bezeichnen. Es ist ein Signalobjekt ; Es hat nur eine Bedeutung, weil die Python-Dokumentation besagt, dass es diese Bedeutung hat.In einer bestimmten Python-Interpretersitzung gibt es nur eine Kopie dieses Objekts.
Wenn Sie eine Funktion schreiben und diese Funktion keine explizite
return
Anweisung verwendet,None
wird sie beispielsweise stattdessen zurückgegeben. Auf diese Weise wird die Programmierung mit Funktionen erheblich vereinfacht. eine Funktion immer wieder etwas , auch wenn es nur , dass manNone
Objekt.Sie können es explizit testen:
Eine andere Verwendung besteht darin, optionalen Parametern Funktionen einen 'leeren' Standard zuzuweisen:
Die Funktion
spam()
hat ein optionales Argument. Wenn Siespam()
ohne Angabe aufrufen , wird der StandardwertNone
angegeben, sodass Sie leicht erkennen können, ob die Funktion mit einem Argument aufgerufen wurde oder nicht.Andere Sprachen haben ähnliche Konzepte. SQL hat
NULL
; JavaScript hatundefined
undnull
usw.Beachten Sie, dass in Python Variablen aufgrund ihrer Verwendung vorhanden sind. Sie müssen nicht zuerst eine Variable deklarieren, daher gibt es in Python keine wirklich leeren Variablen. Das Setzen einer Variablen auf
None
ist dann nicht dasselbe wie das Setzen auf einen leeren Standardwert.None
ist auch ein Wert, obwohl er oft verwendet wird, um Leere zu signalisieren . Das Buch, das Sie lesen, ist in diesem Punkt irreführend.quelle
undefined
undnull
.undefined
ist ein Objekt in JavaScript, und Sie können dieses Objekt explizit verwenden, genau wie Sie esNone
in Python verwenden können. Es ist ein Signalobjekt mit fast der gleichen Bedeutung.NULL
dennoch explizit zugewiesen und getestet werden.Dies ist, was die Python-Dokumentation zu sagen hat
None
:Lassen Sie uns bestätigen die Art der
None
erstenAusgabe
Grundsätzlich
NoneType
ist ein Datentyp wieint
,float
etc. Check - out kann die Liste der Standardtypen in Python in 8,15. Typen - Namen für integrierte Typen .Und
None
ist eine Instanz derNoneType
Klasse. Vielleicht möchten wir also Instanzen vonNone
uns selbst erstellen . Lass es uns versuchenAusgabe
So klar, kann keine
NoneType
Instanzen erstellen . Wir müssen uns keine Sorgen um die Einzigartigkeit des Wertes machenNone
.Lassen Sie uns überprüfen, wie wir
None
intern implementiert haben .Ausgabe
Außer
__setattr__
, alle anderen Schreibschutz -Attribute. Es gibt also keine Möglichkeit, die Attribute von zu ändernNone
.Versuchen wir, neue Attribute hinzuzufügen
None
Ausgabe
Die oben gezeigten Anweisungen erzeugen jeweils diese Fehlermeldungen. Dies bedeutet, dass wir keine Attribute dynamisch für eine
None
Instanz erstellen können .Lassen Sie uns überprüfen, was passiert, wenn wir etwas zuweisen
None
. Gemäß der Dokumentation sollte es ein werfenSyntaxError
. Das heißt, wenn wir etwas zuweisen,None
wird das Programm überhaupt nicht ausgeführt.Ausgabe
Das haben wir festgestellt
None
ist eine Instanz vonNoneType
None
kann keine neuen Attribute habenNone
können nicht geändert werden.NoneType
None
indem wir ihm Werte zuweisen.Also, wie in der Dokumentation erwähnt,
None
kann wirklich als betrachtet werdentrue constant
.Glückliches Wissen
None
:)quelle
__setattr__
für keine verwendet wirdDas Buch, auf das Sie sich beziehen, versucht eindeutig, die Bedeutung von stark zu vereinfachen
None
. Python - Variablen nicht haben eine anfängliche, leeren Zustand - Python Variablen gebunden (nur) , wenn sie definiert sind . Sie können eine Python-Variable nicht erstellen, ohne einen Wert anzugeben.Manchmal möchten Sie jedoch festlegen, dass eine Funktion unterschiedliche Bedeutungen hat, je nachdem, ob eine Variable definiert ist oder nicht. Sie können ein Argument mit dem Standardwert erstellen
None
:Die Tatsache, dass dieser Wert der Sonderwert
None
ist, ist in diesem Fall nicht besonders wichtig. Ich hätte jeden Standardwert verwenden können:… Aber
None
herum zu haben bringt uns zwei Vorteile:-1
dessen Bedeutung unklar ist, und-1
als normale Eingabe behandelt werden.Hoppla!
Daher ist das Buch ein wenig irreführend, vor allem in Bezug auf die Verwendung des Wortes " Zurücksetzen". Das Zuweisen
None
eines Namens ist ein Signal an einen Programmierer, dass dieser Wert nicht verwendet wird oder dass sich die Funktion standardmäßig verhalten sollte, sondern um einen Wert zurückzusetzen In den ursprünglichen, undefinierten Zustand müssen Sie dasdel
Schlüsselwort verwenden:quelle
Andere Antworten haben die Bedeutung von None bereits wunderschön erklärt. Ich möchte dies jedoch noch anhand eines Beispiels näher erläutern.
Beispiel:
Versuchen Sie nun, die Ausgabe der obigen Liste zu erraten. Nun, die Antwort ist überraschend wie folgt:
Aber wieso?
Viele werden fälschlicherweise erwarten, dass list1 gleich [10] und list3 gleich ['a'] ist , da sie denken, dass das list-Argument bei jedem Aufruf von extensList auf den Standardwert [] gesetzt wird.
Was jedoch tatsächlich passiert, ist, dass die neue Standardliste nur einmal erstellt wird, wenn die Funktion definiert wird , und dass dieselbe Liste anschließend verwendet wird, wenn expandList aufgerufen wird, ohne dass ein Listenargument angegeben wird. Das ist weil Ausdrücke in Standardargumenten berechnet werden, wenn die Funktion definiert wird, nicht wenn sie aufgerufen wird .
list1 und list3 arbeiten daher mit derselben Standardliste, während list2 mit einer separaten Liste arbeitet, die sie erstellt hat (indem sie ihre eigene leere Liste als Wert für den Listenparameter übergibt).
'Keiner' der Retter: (Ändern Sie das obige Beispiel, um das gewünschte Verhalten zu erzielen.)
Mit dieser überarbeiteten Implementierung wäre die Ausgabe:
Hinweis - Beispielgutschrift für toptal.com
quelle
None ist ein Singleton-Objekt (dh es gibt nur ein None), das an vielen Stellen in der Sprache und Bibliothek verwendet wird, um das Fehlen eines anderen Werts darzustellen.
Zum Beispiel:
Wenn
d
ein Wörterbuch ist,d.get(k)
wird zurückkehren ,d[k]
wenn es vorhanden ist , aberNone
wennd
keine Schlüssel hatk
.Lesen Sie diese Informationen aus einem großartigen Blog: http://python-history.blogspot.in/
quelle
All dies sind gute Antworten, aber ich denke, es gibt mehr zu erklären, warum
None
nützlich ist.Stellen Sie sich vor, Sie sammeln RSVPs für eine Hochzeit. Sie möchten aufzeichnen, ob jede Person teilnehmen wird. Wenn sie anwesend sind, legen Sie fest
person.attending = True
. Wenn sie nicht anwesend sind, setzen Sieperson.attending = False
. Wenn Sie kein RSVP erhalten haben, dannperson.attending = None
. Auf diese Weise können Sie zwischen keiner Information -None
- und einer negativen Antwort unterscheiden.quelle
Ich liebe Codebeispiele (sowie Obst), also lass es mich dir zeigen
Keiner bedeutet nichts, es hat keinen Wert.
Keiner wird mit Falsch bewertet.
quelle
print(None)
druckt ..None
. Es tut nicht , wie Sie vorschlagen, drucken nichts.None
wenn es das Ergebnis des letzten Ausdrucks ist. (Dies ist vor allem für Funktionen hilfreich, die keinen Wert zurückgeben sollen.)None
wenn dies das Ergebnis eines Ausdrucks ist, hauptsächlich, um die Ausgabe nicht zu überladen.quelle