Veröffentlicht am

Variablen tauschen in Python und Java

Variablen Werte tauschen

Variablen tauschen in Python und Java

Die Werte zweier Variablen sollen vertauscht werden. Eine alltägliche Anforderung die es in sich hat. Ein Rezept funktioniert in jeder Programmiersprache. Doch Python bietet eine besonders einfache Möglichkeit.

Autorin: Ursula Deriu

Werte von Variablen vertauschen mit Java

Dies ist ein häufig gesehener Anfängerfehler:

/* Variablen definieren und initialisieren */
int a = 47;
int b = 11;
/* Variablen tauschen */
a = b;
b = a;
/* Variablen ausgeben */
System.out.println("a="+a+" b="+b);

Das Ergebnis der Bemühung sieht so aus:

a=11 b=11

Die Erklärung ist mehrstufig:

Das Gleichheitszeichen

Das Gleichheitszeichen ist nicht die mathematsiche Gleichheit sondern der Zuweisungsoperator: Der Wert der Variablen links vom Zuweisungsoperator wird mit dem Wert der Variablen rechts vom Zuweisungsoperator überschrieben. Der alte Wert geht dabei verloren.

Also:

  • Der Befehl a  = b bewirkt, dass der Wert von b, also 11 in die Variable a kopiert wird. Die Variable a hat danach den Wert 11.
  • Der nachfolgende Befehl b = a bewirkt, dass der Wert von a, der jetzt ja 11 beträgt, in die Variable b kopiert wird.

So entsteht das Ergebnis.

Die Abhilfe ist einfach – eine Hilfsvariable:

int hilfsvariable = a;
a = b;
b = hilfsvariable;

Was passiert:

  • Mit int c = a wird eine neue Variable mit der Bezeichnung c definiert und mit dem Wert der Variablen a initialisiert. hilfsvariable hat also den Wert 47;
  • a = b kopiert den Wert der Variablen b in die Variable a. a hat also den Wert 11.
  • b = c kopiert jetzt den Wert der Variable hilfsvariable in die Variable a und diese nimmt damit wie erwartet den Wert 47 an.

Fertig. Das Rezept funktioniet in jeder Programmiersprache – auch in Python.

Variablen tauschen in Python – einfache Variante

Python ist keine typsichere Sprache, wir brauchen also den Datentyp einer Variablen nicht zu definieren. Der Python-Interpreter findet diesen für uns heraus. Der Java Code aus unserem Beispiel sieht in Python so aus:

a = 47
b = 11
c = a
a = b
b = c
print(f'a={a} b={b}')

Probier gleich aus auf dem Python Playground.

Variablen tauschen in Python – fortgeschrittene Variante

Python bietet viel Magie – auch für das Tauschen von Variablenwerten. Statt drei Zeilen reicht eine Zeile: (b, a) = (a, b). Sehr intuitiv, nicht wahr.

a = 47
b = 11
(b, a) = (a, b)
print(f'a={a} b={b}')

Probier gleich aus auf dem Python Playground.

Doch was steckt dahinter? Viele Konzepte laufen zusammen, um diese einfach Möglichkeit anzubieten.

Pointer

Eine Variable in Python bedeutet eigentlich nur einen Verweis auf eine Stelle im Memory. Also eine Adresse. Der Python-Interpreter den Variablen während der Programmausführung die jeweiligen Adressen zu. Das ist auch in anderen Programmiersprachen so.  Der Artikel Primitive Datentypen vergleicht Java und Python im Hinblick auf die Art und Weise, wie Variablen gespeichert werden.

Der Fachbegriff für Verweis ist Pointer (oder Zeiger). Und ein Pointer ist eigentlich eine Adresse im RAM. Die Speicherstellen im RAM sind ja durchnummeriert und die Nummer dient als Adresse. Das können wir uns vorstellen, wie auf diesem Bild:

Variablen und Pointer
Die Speicherstellen sind im RAM nummeriert, d.h. adressiert. So werden Verweise auf Speicherstellen gebildet.

a bedeutet also eigentlich eine Adresse, also ein Zeiger ins RAM (Random Access Memory). Ohne sich darum zu kümmern, verwenden Python-Programmierer ständig Pointers.

In anderen Sprachen, beispielsweise C, sorgt man sich beim Programmieren ständig um Pointers.

Tupel

In Python ist (a, b) ein Tupel – also ein eigener Datentyp. Eigentlich müsste man sagen, ein Objekt des Typs Tupel. Doch das ist zu umständlich.

Tupel sind eingebaute Datentypen – und so können wir sie auch ohne speziellen Aufruf eines Konstruktors verwenden – also einfach (a, b) schreiben und damit ist das Tupel gebildet. Und auch ein Tupel ist als Objekt eigentlich nur ein Pointer.

Tupel im Memory
Tupel haben eine eigene Adresse im Memory. Sie enthalten wiederum Adressen, die auf die Tupel-Elemente verweisen.

Zuweisungszeichen

Das Gleichheitszeichen ist in Python – und nicht nur dort – der Zuweisungsoperator:
Der Wert des Ausdrucks rechts vom Zuweisungszeichen, wird der Variablen links vom Zusweisungszeichen zugeordnet.

Eigentlich werden nur Pointers umgehängt – Das Bild zeigt die folgenden Befehle:

a = 47
c = a
Zuweisung im Memory
Eine Zuweisung hängt Pointer um.

Und das auf die Spitze getrieben münde bei Python in den Code (b, a) = (a, b).

Was der Code bewirkt, sehen wir im Python Playground:

Python Code zum Vertauschen von Variablen

Die Werte der Variablen a und b werden also vertauscht.

So elegant geht das und so viel steckt dahinter.

Der Aufwand der Python-Magie

Eine Extra-Variable c einfügen erscheint auf den ersten Blick umständlich und Python erscheint viel sparsamer.

Doch der Schein trügt: In Python haben wir sogar zwei Extra-Objekte: nämlich das Tupel (a, b) und das Tupel (b, a).

So gesehen ist Python für die Anwender sparsam, doch die Python-Magie kostet im Hintergrund ganz schön viel Platz und auch viel Ausführungszeit.

Zeit ist Geld – das ist nichts Neues. Als Programmiererinnen und Programmierer konzentrieren wir uns gerne auf die unmittelbaren Fragestellungen und da ist Python natürlich attraktiv.

Welche Klammer bedeutet was? [] oder{} oder () oder gar (()) ?

Cheat Sheet für Python-Anfänger: Wichtigste Python-Datentypen

Die wichtigsten Built-in-Datentypen von Python auf einen Blick. Ein unverzichtbarer Spickzettel beim Durchstarten mit Python. Einfach herunterladen.

Mit Python Programmieren lernen