Wie verweise ich auf das Null-Objekt in Python?
1193
In Python ist das 'null'-Objekt der Singleton None
.
Der beste Weg, um Dinge auf "Noneness" zu überprüfen, ist die Verwendung des Identitätsoperators is
:
if foo is None:
...
egg is None
überegg == None
: Letzteres kann überlastet werden und ist wahrscheinlich zu brechen , wenn sie mit keinem gültigen Objekt zu vergleichen (hängt davon ab , wie es umgesetzt wird , aber erwarten Sie nicht alle Vergleiche mit nehmen Keiner Rechnung, nicht wahr?) , währendis
immer gleich funktioniert.None
, Python ist null?Es gibt kein
null
in Python, stattdessen gibt esNone
. Wie bereits erwähnt, besteht der genaueste Weg, um zu testen, ob etwasNone
als Wert angegeben wurde, darin, denis
Identitätsoperator zu verwenden , der testet, dass zwei Variablen auf dasselbe Objekt verweisen.Die Grundlagen
Es gibt und kann nur einen geben
None
None
ist die einzige Instanz der Klasse,NoneType
und alle weiteren Versuche, diese Klasse zu instanziieren, geben dasselbe Objekt zurück, wodurchNone
ein Singleton erstellt wird. Python-Neulinge sehen häufig Fehlermeldungen, die erwähnenNoneType
und sich fragen, was es ist. Ich persönlich bin der Meinung, dass diese Nachrichten einfach nur namentlich erwähntNone
werden könnten, da sie, wie wir gleich sehen werden,None
wenig Raum für Unklarheiten lassen. Wenn Sie also eineTypeError
Nachricht sehen, in der erwähnt wird, dassNoneType
dies nicht oder nicht möglich ist, wissen Sie einfach, dass es einfach diejenige istNone
, die auf eine Weise verwendet wurde, die es nicht kann.Ist auch
None
eine eingebaute Konstante, sobald Sie Python starten, kann sie von überall verwendet werden, egal ob in Modul, Klasse oder Funktion.NoneType
Im Gegensatz dazu müssen Sie zuerst einen Verweis darauf erhalten, indem SieNone
nach seiner Klasse fragen .Sie können die
None
Eindeutigkeit mit der Identitätsfunktion von Python überprüfenid()
. Es gibt die einem Objekt zugewiesene eindeutige Nummer zurück, jedes Objekt hat eine. Wenn die ID zweier Variablen identisch ist, verweisen sie tatsächlich auf dasselbe Objekt.None
kann nicht überschrieben werdenIn einer viel älteren Version von Python (vor 2.4) war eine Neuzuweisung möglich
None
, jedoch nicht mehr. Nicht einmal als Klassenattribut oder in den Grenzen einer Funktion.Es ist daher davon auszugehen, dass alle
None
Referenzen gleich sind. Es gibt keinen "Brauch"None
.Zum Testen auf
None
Verwendung desis
BedienersWenn Sie Code schreiben, könnten Sie versucht sein, wie folgt auf Noneness zu testen :
Oder um auf solche Unwahrheiten zu testen
Sie müssen die Auswirkungen verstehen und wissen, warum es oft eine gute Idee ist, explizit zu sein.
Fall 1: Testen, ob ein Wert ist
None
warum das tun
eher, als
Der erste entspricht:
Während der Ausdruck
value==None
tatsächlich so angewendet wirdWenn der Wert wirklich ist, erhalten
None
Sie das, was Sie erwartet haben.In den meisten Fällen ist das Ergebnis dasselbe, aber die
__eq__()
Methode öffnet eine Tür, die jegliche Garantie für die Genauigkeit ungültig macht, da sie in einer Klasse überschrieben werden kann, um ein spezielles Verhalten bereitzustellen.Betrachten Sie diese Klasse.
Also probierst du es an
None
und es funktioniertAber dann funktioniert es auch mit der leeren Zeichenfolge
Und doch
Fall 2: Verwendung
None
als Boolescher WertDie folgenden zwei Tests
werden in der Tat als bewertet
None
ist ein "Falsey", was bedeutet, dass wenn er in einen Booleschen Wert umgewandelt wird, er zurückkehrtFalse
und wenn er angewendet wird, dernot
Operator zurückkehrtTrue
. Beachten Sie jedoch, dass es sich nicht nur um eine Eigenschaft handeltNone
. Zusätzlich zu sichFalse
selbst wird die Eigenschaft von leeren Listen, Tupeln, Mengen, Diktaten, Zeichenfolgen sowie 0 und allen Objekten aus Klassen, die die zurückzugebende__bool__()
magische Methode implementieren , gemeinsam genutztFalse
.Achten Sie beim Testen auf Variablen auf folgende Weise besonders darauf, was Sie in den Test einschließen oder ausschließen:
Wollten Sie oben aufrufen,
init_value()
wenn der Wert speziell auf eingestellt istNone
, oder meinten Sie, dass ein auf0
oder die leere Zeichenfolge oder eine leere Liste festgelegter Wert auch die Initialisierung auslösen sollte. Wie ich schon sagte, sei achtsam. Wie so oft in Python ist explizit besser als implizit .None
in der PraxisNone
als Signalwert verwendetNone
hat einen besonderen Status in Python. Es ist ein beliebter Basiswert, da viele Algorithmen ihn als außergewöhnlichen Wert behandeln. In solchen Szenarien kann es als Flag verwendet werden, um zu signalisieren, dass eine Bedingung eine spezielle Behandlung erfordert (z. B. das Festlegen eines Standardwerts).Sie können
None
den Schlüsselwortargumenten einer Funktion zuweisen und diese dann explizit testen.Sie können es als Standard zurückgeben, wenn Sie versuchen, das Attribut eines Objekts aufzurufen, und es dann explizit testen, bevor Sie etwas Besonderes tun.
Standardmäßig wird die
get()
Methode eines Wörterbuchs zurückgegeben ,None
wenn versucht wird, auf einen nicht vorhandenen Schlüssel zuzugreifen:Wenn Sie versuchen würden, mit der tiefgestellten Notation darauf zuzugreifen, wird a
KeyError
ausgelöstEbenso, wenn Sie versuchen, ein nicht vorhandenes Element zu platzieren
Dies können Sie mit einem Standardwert unterdrücken, der normalerweise auf eingestellt ist
None
None
wird sowohl als Flag als auch als gültiger Wert verwendetDie oben beschriebenen Verwendungen von
None
gelten, wenn sie nicht als gültiger Wert angesehen werden, sondern eher als Signal, etwas Besonderes zu tun. Es gibt jedoch Situationen, in denen es manchmal wichtig ist zu wissen, woher sieNone
stammen, da sie, obwohl sie als Signal verwendet werden, auch Teil der Daten sein können.Wenn Sie ein Objekt für seine Attribut Abfrage mit
getattr(some_obj, 'attribute_name', None)
zurückzubekommenNone
Sie nicht sagen , ob das Attribut , das Sie zugreifen möchten , wurden eingestellt wurdeNone
oder ob es überhaupt von dem Objekt nicht gefunden . Dieselbe Situation beim Zugriff auf einen Schlüssel aus einem Wörterbuch wiesome_dict.get('some_key')
: Sie wissen nicht, ob ersome_dict['some_key']
fehlt oder nur auf gesetzt istNone
. Wenn Sie diese Informationen benötigen, versuchen Sie normalerweise, direkt aus einemtry/except
Konstrukt heraus auf das Attribut oder den Schlüssel zuzugreifen :Ähnlich mit Diktat:
Die obigen zwei Beispiele zeigen, wie mit Objekt- und Wörterbuchfällen umgegangen wird. Was ist mit Funktionen? Das Gleiche, aber wir verwenden zu diesem Zweck das Schlüsselwortargument mit doppelten Sternchen:
None
wird nur als gültiger Wert verwendetWenn Sie feststellen, dass Ihr Code mit dem obigen
try/except
Muster übersät ist , nur um zwischenNone
Flags undNone
Daten zu unterscheiden , verwenden Sie einfach einen anderen Testwert. Es gibt ein Muster, bei dem ein Wert, der außerhalb des Satzes gültiger Werte liegt, als Teil der Daten in eine Datenstruktur eingefügt wird und zum Steuern und Testen spezieller Bedingungen (z. B. Grenzen, Status usw.) verwendet wird. Ein solcher Wert wird als Sentinel bezeichnet und kann so verwendet werdenNone
, wie er als Signal verwendet wird. Es ist trivial, einen Sentinel in Python zu erstellen.Das
undefined
obige Objekt ist einzigartig und macht nicht viel, was für ein Programm von Interesse sein könnte. Es ist daher ein hervorragender Ersatz fürNone
eine Flagge. Es gelten einige Einschränkungen, mehr dazu nach dem Code.Mit Funktion
Mit Diktat
Mit einem Objekt
Wie ich bereits erwähnt habe, sind benutzerdefinierte Sentinels mit einigen Einschränkungen verbunden. Erstens sind sie keine Schlüsselwörter wie
None
, also schützt Python sie nicht. Sie können Ihreundefined
obigen Angaben jederzeit und an jeder Stelle im Modul überschreiben , an der sie definiert sind. Seien Sie also vorsichtig, wie Sie sie verfügbar machen und verwenden. Als nächstes ist die von zurückgegebene Instanzobject()
kein Singleton. Wenn Sie diesen Aufruf 10 Mal ausführen, erhalten Sie 10 verschiedene Objekte. Schließlich ist die Verwendung eines Sentinels sehr eigenwillig. Ein Sentinel ist spezifisch für die Bibliothek, in der er verwendet wird, und daher sollte sein Umfang im Allgemeinen auf die Interna der Bibliothek beschränkt sein. Es sollte nicht "auslaufen". Externer Code sollte nur dann darauf aufmerksam werden, wenn der Zweck darin besteht, die API der Bibliothek zu erweitern oder zu ergänzen.quelle
Es heißt nicht null wie in anderen Sprachen, aber
None
. Es gibt immer nur eine Instanz dieses Objekts, sodass Sie die Äquivalenz mitx is None
(Identitätsvergleich) überprüfen können, anstattx == None
, wenn Sie möchten.quelle
None
. Dann werden all diese klugen Leute, die sich mit ihnen vergleichenNoneType
, triumphieren!Um in Python das Fehlen eines Werts darzustellen, können Sie den Wert None ( types.NoneType.None ) für Objekte und "" (oder len () == 0 ) für Zeichenfolgen verwenden. Deshalb:
In Bezug auf den Unterschied zwischen "==" und "is" sollte das Testen der Objektidentität mit "==" ausreichend sein. Da die Operation "ist" jedoch als Objektidentitätsoperation definiert ist, ist es wahrscheinlich korrekter, sie zu verwenden, als "==". Ich bin mir nicht sicher, ob es überhaupt einen Geschwindigkeitsunterschied gibt.
Wie auch immer, Sie können einen Blick darauf werfen:
quelle
0 == false
kehrttrue
ist , weil die Doppel-Gleichheitsoperator Art Zwang tut. Mit dem Triple-Equals-Operator wird jedoch0 === false
zurückgegebenfalse
, da 'number' und 'boolean' unterschiedliche Typen sind.true
in Bedingungen behandelt . In Rust and Go0
undfalse
sind verschiedene Typen, die nicht für Gleichheit verglichen werden können.Null ist ein spezieller Objekttyp wie:
Sie können überprüfen, ob sich ein Objekt in der Klasse 'NoneType' befindet:
Weitere Informationen finden Sie unter Python Docs
quelle
Bei der Prüfung des Wahrheitswertes wird 'Keine' direkt als FALSCH getestet, sodass der einfachste Ausdruck ausreicht:
quelle
True
für jeden falschen Wert zurückgegeben, nicht nurNone
.