HOWTO · Python
Wie man eine Variable ohne Wert in Python deklariert
Erfahren Sie, wie Python einen ungebundenen Namen, einen `None`-Platzhalter, eine Annotation ohne Zuweisung sowie Werte in Form einer leeren Zeichenkette oder Liste behandelt.
Auf dieser Seite
Um eine Variable für einen Wert vorzubereiten, den Sie später angeben werden, weisen Sie None als Platzhalter zu. Python bindet einen Namen nur, wenn eine Zuweisung ausgeführt wird; einen Namen lediglich zu erwähnen oder eine Annotation zu schreiben, verleiht ihm keinen Laufzeitwert. Verwenden Sie eine Variablenannotation, wenn Sie einen Typ festhalten müssen, ohne etwas zuzuweisen, oder weisen Sie eine leere Zeichenkette oder Liste zu, wenn das der Wert ist, mit dem Sie beginnen möchten.
Wie Python mit einer Variable ohne zugewiesenen Wert umgeht
In Python erzeugt eine Zuweisung eine Bindung zwischen einem Namen und einem Objekt. Ein Name, der im aktuellen Gültigkeitsbereich nicht zugewiesen wurde, ist ungebunden. Ihn zu lesen, löst NameError aus; er ist keine Variable, die einen speziellen „Nichts“-Wert enthält. Diese Unterscheidung ist wichtig, wenn Sie entscheiden, wie Sie Daten darstellen, die später bereitgestellt werden.
Die folgenden Optionen erzeugen unterschiedliche Zustände: None ist ein zugewiesener Platzhalter, eine Annotation zeichnet Typinformationen auf, ohne einen Wert zuzuweisen, und eine leere Zeichenkette oder Liste ist ein zugewiesenes Objekt, das sofort verwendet werden kann.
None als Platzhalter zuweisen
Weisen Sie None zu, wenn der Name jetzt existieren soll, der sinnvolle Wert aber noch nicht verfügbar ist. None ist Pythons Singleton-Objekt zur Darstellung von Abwesenheit; es zuzuweisen bindet den Namen, sodass sich dies davon unterscheidet, den Namen ungebunden zu lassen. Prüfen Sie darauf mit is None.
Führen Sie dieses vollständige Beispiel aus, um die drei Möglichkeiten zu vergleichen:
profile = None
message = ""
items = []
if profile is None:
profile = {"name": "Ada"}
message += "Hello"
items.append("first")
print(profile["name"])
print(message)
print(items)
Nach der Prüfung verweist profile auf ein Wörterbuch. Ein None-Standardwert für einen Parameter unterscheidet ein ausgelassenes Argument von einem übergebenen Wert, der nicht None ist, weil der übergebene Wert den Standardwert ersetzt. Er kann das Auslassen nicht von einem expliziten None unterscheiden; verwenden Sie ein eindeutiges Sentinel-Objekt als Standardwert, wenn diese Aufrufe unterschiedlich behandelt werden müssen.
Eine Variablenannotation verwenden, ohne einen Wert zuzuweisen
Eine Variablenannotation kann den beabsichtigten Typ festhalten, ohne einen Laufzeitwert an den Namen zu binden:
name: str
Dies ist eine Annotation, keine Zuweisung. Die Annotation ist möglicherweise über die Annotationsdaten des enthaltenden Moduls oder der Klasse verfügbar, aber name zu lesen, bevor Sie ihm einen Wert zuweisen, löst weiterhin NameError aus. Wenn späterer Code den Wert lesen muss, weisen Sie zuerst einen zu, etwa name = "Ada". Verwenden Sie die Syntax mit reiner Annotation, wenn es nützlich ist, den beabsichtigten Typ zu dokumentieren, und die Zuweisung andernorts erfolgen soll.
Eine leere Zeichenkette oder Liste verwenden, wenn ein leerer Wert beabsichtigt ist
Weisen Sie einen leeren Wert zu, wenn er bereits der richtige Anfangswert für Ihre Aufgabe ist. Eine leere Zeichenkette ist immer noch eine Zeichenkette, und eine leere Liste ist immer noch eine Liste; keine von beiden stellt einen ungebundenen Namen oder einen None-Platzhalter dar.
Das obige Beispiel beginnt message als leere Zeichenkette und items als leere Liste und fügt dann Inhalt hinzu. Wählen Sie den Typ, der zu den Daten passt, die Sie speichern möchten. Eine Liste kann später mit Methoden wie append() oder extend() befüllt werden.
Die Form wählen, die zu Ihrer Absicht passt
- Verwenden Sie
None, wenn Abwesenheit von Bedeutung ist und der Name bereits gebunden sein soll. Prüfen Sie ihn mitis None, bevor Sie den Platzhalter ersetzen oder verwenden. - Verwenden Sie eine Annotation wie
name: str, wenn Sie den beabsichtigten Typ festhalten müssen, aber zu diesem Zeitpunkt keinen Wert zuweisen möchten. Sie macht den Namen zur Laufzeit nicht lesbar. - Verwenden Sie
""oder[], wenn eine leere Zeichenkette oder Sammlung der tatsächliche Anfangswert ist, den Ihr Code benötigt.
Wenn ein Lesezugriff NameError auslöst, prüfen Sie zuerst, ob in diesem Gültigkeitsbereich eine Zuweisung ausgeführt wurde. Weisen Sie None zu, wenn Sie einen Platzhalter benötigen, oder initialisieren Sie den Wert, den Ihr Code verwenden wird. Verwenden Sie die Syntax mit reiner Annotation nicht als Ersatz für die Initialisierung zur Laufzeit.