Eine Adressliste kopierent

Ganz einfach, oder?

Wie kopiert man eine E-Mail-Liste? Das ist gar nicht so einfach, wie der folgende Python-Dialog zeigt.

>>> adressen1 = ['amueller@gmx.de', 'carla2@hotmail.org', 'herbert.fluhr@web.de', 'petra@dahm.de']
>>> adressen2 = adressen1
>>> adressen2[1] = 'carla@mueller.de'
>>> adressen2
['amueller@gmx.de', 'carla@mueller.de', 'herbert.fluhr@web.de', 'petra@dahm.de']
>>> adressen1
['amueller@gmx.de', 'carla@mueller.de', 'herbert.fluhr@web.de', 'petra@dahm.de']

Aufgabe 1

Probiere das selbst aus. Warum ist das Ergebnis hier unbefriedigend?

Verwaltung von Listen mit Variablen

Um die oben gezeigten Ergebnisse zu verstehen, muss man sich zunächst damit vertraut machen, wie Datenobjekte in Python mit Hilfe von Variablen verwaltet werden.

Jedes Datenobjekt hat (in Python) eine Identitätsnummer, einen Typ und einen bestimmten Wert. Der folgende Python-Dialog zeigt, wie man sich diese Informationen über ein Datenobjekt in Python verschaffen kann.

>>> id([4, 13, 21, 33, 34, 42])
12289008
>>> type([4, 13, 21, 33, 34, 42])

>>> [4, 13, 21, 33, 34, 42]
[4, 13, 21, 33, 34, 42]

Die Identitätsnummer eines Datenobjekts erhält man mit dem id-Operator, den Typ des Datenobjekts man mit dem type-Operator bestimmen. Den Wert erhält man, wenn man seine Darstellung auswerten lässt.

Beachte, dass es mehrere Datenobjekte mit demselben Typ und Wert geben kann. Diese unterscheiden sich aber in der Identitätsnummer.

>>> id([4, 13, 21, 33, 34, 42])
12289008
>>> id([4, 13, 21, 33, 34, 42])
12288448

Jeder Aufruf des Ausdrucks [4, 13, 21, 33, 34, 42] erzeugt hier ein neues Datenobjekt, das sich dann in der Identitätsnummer von anderen Datenobjekten mit demselben Wert unterscheidet.

Variablen dienen in der Informatik dazu, Datenobjekte zu verwalten.

Variablen werden an Datenobjekte angebunden, um die betreffenden Datenobjekte verwalten zu können. Die folgende Abbildung zeigt eine solche Situation, bei der die Variable liste1 an ein Datenobjekt mit dem Wert [4, 13, 21, 33, 34, 42] angebunden ist. Man sagt auch, dass die Variable das betreffende Datenobjekt referenziert.

aktueller Variablenzustand

Eine Variable, die ein Datenobjekt referenziert, ist ein Name für das betreffende Datenobjekt. Das sieht man im folgenden Python-Dialog. Mit dem Variablennamen kann man sich die Identitätsnummer, den Typ und den Wert des referenzierten Datenobjekts verschaffen.

>>> liste1 = [4, 13, 21, 33, 34, 42]
>>> id(liste1)
12289008
>>> type(liste1)

>>> liste1
[4, 13, 21, 33, 34, 42]

Eine Zuweisung an eine Variable wie im Beispiel liste1 = [4, 13, 21, 33, 34, 42] führt dazu, dass die Variable an ein Datenobjekt angebunden wird.

Listen als veränderbare Datenobjekte

Die folgenden Abbildungen sollen an einem konkreten Beispiel die Auswertung von Zuweisungen verdeutlichen, bei denen u.a. auch die interne Struktur von Listenobjekten verändert wird.

liste1 = [4, 13, 21, 33, 34, 42]

Die Zuweisung liste1 = [4, 13, 21, 33, 34, 42] bindet die Variable liste1 an ein Listenobjekt mit dem Wert [4, 13, 21, 33, 34, 42]

aktueller Variablenzustand

liste2 = liste1

Die Zuweisung liste2 = liste1 bewirkt, dass die Variable liste2 dasselbe Listenobjekt referenziert wie die Variable liste1.

aktueller Variablenzustand

liste2[1] = 8

Die Zuweisung liste2[1] = 8 bewirkt, dass die innere Struktur des von liste2 referenzierten Listenobjekts verändert wird. Da liste1 dasselbe Listenobjekt referenziert, wird der Wert von liste1 hierdurch ebenfalls verändert.

aktueller Variablenzustand

liste1 = [4, 13, 21, 33, 34, 42]

Die Zuweisung liste1 = [4, 13, 21, 33, 34, 42] bewirkt, dass ein neues Listenobjekt mit dem Wert [4, 13, 21, 33, 34, 42] erzeugt wird und von der Variablen liste1 referenziert wird.

aktueller Variablenzustand

liste2[0] = 3

Die Zuweisung liste2[0] = 3 verändert jetzt nur das von liste2 referenzierte Listenobjekt. Der Wert des von liste1 referenzierten Listenobjekts ändert sich hierdurch nicht.

aktueller Variablenzustand

Kopieren - ganz einfach!

Wie fertigt man eine Kopie einer E-Mail-Liste an? Hier zwei Lösungen!

Eine Liste kopieren - Version 1:

>>> adressen1 = ['amueller@gmx.de', 'carla2@hotmail.org', 'herbert.fluhr@web.de', 'petra@dahm.de']
>>> adressen2 = []
>>> for element in adressen1:
        adressen2 = adressen2 + [element]

	
>>> adressen1
['amueller@gmx.de', 'carla2@hotmail.org', 'herbert.fluhr@web.de', 'petra@dahm.de']
>>> id(adressen1)
20306640
>>> adressen2
['amueller@gmx.de', 'carla2@hotmail.org', 'herbert.fluhr@web.de', 'petra@dahm.de']
>>> id(adressen2)
20306120
>>> adressen2[1] = 'carla@mueller.de'
>>> adressen1
['amueller@gmx.de', 'carla2@hotmail.org', 'herbert.fluhr@web.de', 'petra@dahm.de']
>>> adressen2
['amueller@gmx.de', 'carla@mueller.de', 'herbert.fluhr@web.de', 'petra@dahm.de']

Eine Liste kopieren - Version 2:

>>> adressen1 = ['amueller@gmx.de', 'carla2@hotmail.org', 'herbert.fluhr@web.de', 'petra@dahm.de']
>>> adressen2 = adressen1[:]
>>> adressen1
['amueller@gmx.de', 'carla2@hotmail.org', 'herbert.fluhr@web.de', 'petra@dahm.de']
>>> id(adressen1)
20306640
>>> adressen2
['amueller@gmx.de', 'carla2@hotmail.org', 'herbert.fluhr@web.de', 'petra@dahm.de']
>>> id(adressen2)
10126560
>>> adressen2[1] = 'carla@mueller.de'
>>> adressen1
['amueller@gmx.de', 'carla2@hotmail.org', 'herbert.fluhr@web.de', 'petra@dahm.de']
>>> adressen2
['amueller@gmx.de', 'carla@mueller.de', 'herbert.fluhr@web.de', 'petra@dahm.de']

Aufgabe 2

Probiere das mit selbst gewählten Daten aus. Kannst du die Vorgänge auch erklären?

X

Fehler melden

X

Suche