2.6. Variablen#

Angenommen, wir wollen den Wert, der ausgegeben wird, wenn der Ausdruck 3 == 3 and "c" == "c" evaluiert wird, im Programmverlauf noch einmal verwenden. Dann wäre es unpraktisch, wenn wir jedes Mal den gesamten Ausdruck kopieren müssten. Wenn wir später die 3 durch eine 4 ersetzen, müssten wir dann alle Stellen finden, wo derselbe Ausdruck vorkommt, und überall die Änderung vornehmen. So entstehen schnell Fehler.

Aus diesem Grund gibt es Variablen. Variablen werden verwendet, um Werte “zwischenzuspeichern”, die wiederholt verwendet werden. Werte können mithilfe des Zuweisungsoperators = einer Variable “zugewiesen” werden. Das heißt, dass ein Name festgelegt wird, der für diesen Wert und für einen Speicherplatz steht. Ganz korrekt ausgedrückt würde man sagen, dass ein Objekt oder Wert an einen Namen “gebunden” wird; dieser Name ist sowas wie eine Referenz zu diesem Wert. Eine Zuweisung folgt in Python dem Schema Name = Wert.

So kann mithilfe des Variablennamens auf den damit verknüpften Wert zugegriffen werden, selbst dann, wenn sich der Wert im Programmverlauf verändert hat. Variablen sind also sowas wie Platzhalter für Werte eines Datentyps.

Bei der Benennung von Variablen sollten bestimmte Regeln und die Konventionen aus unserem Style Guide eingehalten werden:

  • Variablennamen dürfen kein Leerzeichen enthalten (Regel!).

  • Variablennamen dürfen keine Sonderzeichen außer Unterstriche enthalten (Regel!).

  • Zwei Wörter oder ein Wort und eine Zahl können mit Unterstrich oder camelCase getrennt werden. Die Empfehlung des Style Guides ist hier die Verwendung des Unterstrichs.

  • Variablen dürfen nicht mit einer Zahl anfangen (Regel!).

  • Python ist “case sensitive”, das heißt: die Variable baum ist nicht dasselbe wie die Variable Baum!

  • Der Style Guide empfiehlt, Variablennamen komplett in Kleinbuchstaben zu schreiben.

Beim Ausführen einer Zuweisung wird nichts auf dem Bildschirm ausgegeben. Nach der Zuweisung können Werte, die einer Variable zugewiesen sind, mithilfe der Funktion print() auf dem Bildschirm ausgegeben werden.

Note

Eine Zuweisung ist eine Art von Anweisung. Wenn ein Wert einem Namen zugewiesen wird, “macht” der Computer etwas, er ändert den Zustand des Speichers (-> Grundbegriffe).

# Zuweisungen
zahl = 454
satz = "Eine Rose ist eine Pflanze"
satz_2 = "Eine zweite Rose ist auch eine Pflanze"
noch_ein_satz = "Noch eine Rose"
Satz = "Eine Rose ist keine Pflanze"
# Variable Satz auf dem Bildschirm ausgeben 
print(Satz)
Eine Rose ist keine Pflanze
# Variable satz auf dem Bildschirm ausgeben
print(satz)
Eine Rose ist eine Pflanze
# Der Variable satz einen neuen Wert zuweisen
satz = "Ein Apfel ist keine Pflanze"

# Variable satz erneut ausgeben
print(satz)
Ein Apfel ist keine Pflanze
satz == Satz 
False
# Aussagen als Variablen  
aussage_1 = "c" == "c"
aussage_2 = 3 == 5
not aussage_1 == aussage_2
True

Verständnisfragen

  • Warum wird das erste Mal, dass print(satz) ausgeführt wird, ein anderer Wert ausgegeben, als beim zweiten Mal?

  • Warum wird der Ausdruck satz == Satz zu False evaluiert?

  • Was passiert im letzten Beispiel?

Im Beispiel oben haben wir gesehen, dass man Variablen neu zuweisen kann. Im Speicher verschwindet dabei das Objekt, das diesen Wert repräsentiert, allerdings nicht, er wird also nicht einfach überschrieben. Das einzige, was sich ändert, ist, dass der Name jetzt nicht mehr auf dieses alte Objekt zeigt, sondern auf ein neues Objekt im Speicher.

Es ist auch möglich, einer Variable einen neuen Wert zuzuweisen, aber den neuen Wert dabei mit dem alten Wert zu verrechnen. Dazu werden die Zuweisungsoperatoren +=, -=, *= und /= verwendet. Bei den Operatoren handelt es sich eigentlich um Kurzschreibweisen für zwei verschiedene Operatoren, zum Beispiel ist += eine Kurzschreibweise für x = x + y

Beispiel:

alter = 29 
alter += 5
print(alter)
34

2.6.1. Veränderbarkeit und Unveränderbarkeit#

Der Datentyp eines Objekts bestimmt in Python auch, ob das Objekt veränderbar (mutable) oder unveränderbar (immutable) ist, also ob es nachträglich geändert werden kann. Strings sind zum Beispiel unveränderbar. Das heißt, dass ein Zeichen in einem String nicht nachträglich ausgetauscht werden kann. Ein Beispiel für dieses Verhalten haben wir bereits gesehen, nämlich beim Aufruf von String-Methoden. Methoden waren die speziellen Operationen, die nur für Objekte vom Typ String definiert sind. Beim Ausführen von print(wort) wurde der String "Hallo" unverändert ausgegeben, obwohl wir zuvor die Methode wort.lower() aufgerufen haben. Das Objekt wurde also nicht verändert, sondern es wurde eine Kopie davon erzeugt. Das Ergebnis der Operation wort.lower() hätten wir also der Variable wort erneut zuweisen müssen, um später wieder darauf zugreifen zu können. Dieses Verhalten wird anhand des folgenden Beispiels noch deutlicher.

Beispiel:

vorname = "Misa" 

# Nicht erlaubt: Produziert eine Fehlermeldung
# vorname[0] = "L" 

# Erlaubt: Die Variable vorname wird mit einem neuen Objekt verknüpft
vorname = "L"+vorname[1:len(vorname)]
print(vorname)
Lisa

Verständnisfrage

  • Wie müsste der Ausdruck "L"+vorname[1:len(vorname)] verändert werden, um den letzten Buchstaben zu verändern?

Genau wie bei der Neuzuweisung der Variable satz im Beispiel vorhin wird in diesem Beispiel ein neues Objekt erzeugt, ohne, dass das Objekt aus dem Speicher verschwindet. Dieses Verhalten lässt sich mithilfe des bereits bekannten Operators == und dem sogenannten Identitätsoperator is nachvollziehen:

satz == Satz 
False
satz is Satz
False
Satz = "Ein Apfel ist keine Pflanze"
satz == Satz
True
satz is Satz
False

Die Operatoren == und != prüfen zwei Objekte auf Wertgleichheit, also ob sie den gleichen Wert haben. Die Identitätsoperatoren is und is not überprüfen dagegen die Identität oder Verweisgleichheit, also ob ein Objekt identisch mit einem anderen ist. Identisch heißt hier, dass die beiden Objekte auf denselben Speicherplatz verweisen. Wenn gewünscht ist, dass die beiden Namen satz und Satz auf dasselbe Objekt im Speicher zeigen, kann dies erreicht werden, indem der Variable satz die Variable Satz zugewiesen wird (oder andersherum):

satz = Satz
satz is Satz
True

Note

Im Beispiel oben haben wir zwei Variablen satz und Satz, denen die Werte “Eine Rose ist eine Pflanze” und “Ein Apfel ist keine Pflanze” zugewiesen waren, zunächst auf Wertgleichheit und dann auf Identität geprüft. Danach haben wir der Variable Satz denselben Wert zugewiesen wie der Variable satz und wir haben gesehen, dass die beiden Variablen nun zwar wertgleich waren, aber nicht identisch. Erst durch die Zuweisung satz = Satz wurden die beiden Variablen identisch. Es ist wichtig zu beachten, dass dieses Verhalten bei kürzeren Zeichenketten jedoch nicht zum Tragen kommt. Wenn wir das gleiche Beispiel mit den beiden Variablen wort_1 = "Hallo" und wort_2 = "Hallo" wiederholen, wird sowohl wort_1 == wort_2 als auch wort_1 is wort_2 zu True evaluiert. Das liegt daran, dass in diesem Fall in Python ein Mechanismus aktiviert wird, der sich String Interning oder Zeichenketten-Internierung nennt: Anstatt dass ein Duplikat der Zeichenkette im Speicher angelegt wird, verweist die Variable wort_2 automatisch auf das bereits existierende Objekt mit dem Namen wort_1.

2.6.2. Quellen#