Array-Modell, Python-Liste, Referenz und Kopie unterscheiden
Verständlich erklärt
Ein Array fasst im hier verwendeten Grundmodell eine feste Anzahl gleichartig typisierter Elemente zusammen, die über ihre Position angesprochen werden. Wir zählen ab 0: Bei Länge n lauten die Indizes 0 bis n−1; bei Länge 0 existiert kein gültiger Index. Ein Index ist eine Position, nicht der dort gespeicherte Wert.
Python-Listen stellen in diesem Kurs die Folge dar, sind aber keine solchen festen Arrays: Ihre Länge kann sich ändern, sie enthalten Referenzen auf Objekte und dürfen unterschiedliche Objekttypen enthalten. Deklaration bedeutet, einen Namen mit gegebenenfalls einem Typ bekannt zu machen; Initialisierung setzt Anfangswerte. In Python ist keine separate Typdeklaration nötig: a = [3, 5] bindet den Namen an eine mit Startwerten erzeugte Liste. [0] * n initialisiert n Plätze mit 0; die Liste bleibt technisch dynamisch. Unsere Aufgaben verwenden jeweils passend gewählte einheitliche Werte. a[i] liest ein Element, a[i] = neu ersetzt es, ohne die Länge zu ändern. len(a) gibt die Länge zurück; range(len(a)) liefert genau die nichtnegativen Indizes. Python erlaubt auch negative Indizes, doch unsere Aufgaben zum Array-Modell verlangen ausdrücklich 0 ≤ i < len(a).
b = a erstellt keine Kopie: Beide Namen bezeichnen dieselbe Liste. b = a.copy() erzeugt eine neue äußere Liste; bei unseren Zahlenlisten genügt das für unabhängige Elementersetzungen. Enthielte die Liste verschachtelte veränderliche Objekte, wären diese weiterhin gemeinsam referenziert. Zum Tauschen muss der alte Wert erhalten bleiben, etwa mit einer Hilfsvariablen oder mit a[i], a[j] = a[j], a[i]. Funktionen mit dem Auftrag „neue Liste“ dürfen die Eingabe nicht verändern. Mit append(wert) fügst du einer neu erzeugten Python-Ergebnisliste ein Element hinzu.
Array
Deklaration
Initialisierung
Element
Index
Länge
Indexgrenze
Referenz
Kopie
Beispiel
anzahl = 3
nullen = [0] * anzahl # Initialisierung: [0, 0, 0]
werte = [12, 7, 19] # Name an Liste mit Startwerten binden
# Index: 0 1 2
werte[1] = 8 # [12, 8, 19]
kopie = werte.copy()
kopie[0], kopie[2] = kopie[2], kopie[0]
# kopie: [19, 8, 12]; werte bleibt [12, 8, 19]
for i in range(len(werte)):
print(i, werte[i])
Typische Fehler
Das erste Element an Index 1 suchen
len(a) selbst als gültigen Index verwenden
b = a für eine unabhängige Kopie halten
Beim Tauschen einen alten Wert vorzeitig überschreiben
Kurz zusammengefasst
Prüfe vor jedem Zugriff die Position. Python-Listen machen Array-Algorithmen ausführbar, haben aber zusätzliche Eigenschaften wie dynamische Länge und gemeinsame Referenzen.
Abi-Bezug
Beschreibe Indexbereich und Zustandsänderungen präzise. Unterscheide die abstrakte Datenstruktur von der konkreten Python-Darstellung.
Jetzt selbst ausprobieren
Prüfe deine Lösung automatisch. Bei Bedarf helfen dir ein Tipp und anschließend die Musterlösung.
BPE 7J21 Punkteleicht
Array-Modell und Python-Liste
Noch nicht begonnen
Aufgabenstellung
Welche Aussagen passen zu unserer Unterscheidung zwischen dem klassischen Array-Grundmodell und einer Python-Liste? Wähle alle richtigen Antworten.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Trenne die modellierte Datenstruktur von der konkreten Übungssprache.
append verändert die Listenlänge; ein Index beginnt trotzdem bei 0.
Lösung anzeigen
Das Array-Grundmodell hat eine feste Anzahl gleichartig typisierter Elemente. Python-Listen sind dynamisch und beginnen wie unser Array-Modell bei Index 0.
BPE 7J21 Punkteleicht
Der letzte gültige Index
Noch nicht begonnen
Aufgabenstellung
Die Folge [11, 4, 8, 6, 2] hat fünf Elemente. Welcher ist ihr größter gültiger nichtnegativer Index? Antworte nur mit einer ganzen Zahl.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Zähle die Positionen beginnend bei 0, nicht bei 1.
Der letzte Index ist len(a) − 1, also 5 − 1.
Lösung anzeigen
Bei Länge 5 reichen die nichtnegativen Indizes von 0 bis 4. Der Wert am letzten Index ist 2, der gesuchte Index selbst aber 4.
BPE 7J22 Punktemittel
Ersetzungen nacheinander ausführen
Noch nicht begonnen
Aufgabenstellung
Gegeben: a = [9, 4, 2]. Führe zuerst a[1] = a[0] - a[2], dann a[0] = a[1] + 1 aus. Welche Liste entsteht? Antworte mit drei kommagetrennten Zahlen; Leerzeichen und eckige Klammern sind optional.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Berechne die rechte Seite, bevor du den jeweiligen Zielplatz ersetzt.
Der zweite Befehl arbeitet mit dem schon geänderten Wert an Index 1.
Lösung anzeigen
Zuerst wird Index 1 zu 9−2 = 7. Der zweite Befehl liest bereits diese 7 und setzt Index 0 auf 8: [8, 7, 2].
BPE 7J22 Punktemittel
Zwei Namen, dieselbe Liste
Noch nicht begonnen
Aufgabenstellung
a = [3, 6], danach b = a und b[0] = 7. Welche Werte enthält a anschließend? Antworte kommagetrennt, optional mit eckigen Klammern.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Eine Zuweisung eines Listennamens erstellt nicht automatisch eine neue Liste.
Für eine unabhängige äußere Liste wäre beispielsweise b = a.copy() nötig.
Lösung anzeigen
b = a kopiert nur die Referenz. Beide Namen bezeichnen dieselbe Liste; die Änderung über b ist deshalb auch über a sichtbar: [7, 6].
BPE 7J22 Punktemittel
Mit Hilfsvariable sicher tauschen
Noch nicht begonnen
Aufgabenstellung
Start: a = [4, 9, 2]. Danach: hilfe = a[0], a[0] = a[2], a[2] = hilfe. Gib die fertige Liste kommagetrennt an; eckige Klammern sind optional.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Der gespeicherte Hilfswert ändert sich nicht, wenn a[0] überschrieben wird.
Die mittlere Position wird in keinem Befehl verändert.
Lösung anzeigen
hilfe bewahrt die alte 4. Nach der ersten Ersetzung steht vorübergehend [2, 9, 2], danach [2, 9, 4].
BPE 7J22 Punktemittel
Ein vollständiger Indexdurchlauf
Noch nicht begonnen
Aufgabenstellung
a ist eine beliebige, auch leere Liste. Welche Python-Schleifen liefern genau jeden gültigen nichtnegativen Index einmal? Wähle alle richtigen Antworten.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Die obere Grenze von range gehört nicht mehr zum Ergebnis.
Für eine Liste mit einem Element muss genau Index 0 entstehen.
Lösung anzeigen
range(len(a)) und range(0, len(a)) liefern 0 bis len(a)−1; bei leerer Liste liefern beide nichts. +1 erzeugt einen ungültigen Index, Start 1 lässt Index 0 aus.
BPE 7J23 Punkteanspruchsvoll
Den ersten Platz in einer Kopie ersetzen
Noch nicht begonnen
Aufgabenstellung
Schreibe ersetze_ersten(a, neu): Gib eine neue Liste zurück, deren erstes Element durch neu ersetzt ist. Ist a leer, gib eine neue leere Liste zurück. Die Eingabe darf sich nicht ändern.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Arbeite auf a.copy(), damit die Eingabe unverändert bleibt.
Ein erster Platz existiert genau dann, wenn len(ergebnis) > 0 gilt.
Lösung anzeigen
def ersetze_ersten(a, neu):
ergebnis = a.copy()
if len(ergebnis) > 0:
ergebnis[0] = neu
return ergebnis
BPE 7J23 Punkteanspruchsvoll
Zwei gültige Positionen vertauschen
Noch nicht begonnen
Aufgabenstellung
vertausche(a, i, j) soll eine neue Liste liefern, in der die Positionen i und j getauscht sind. Es gilt 0 ≤ i,j < len(a); beide Indizes dürfen gleich sein. Verändere a nicht.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Erstelle zuerst eine Kopie und lies beide alten Werte vor dem Überschreiben.
Eine parallele Zuweisung oder eine Hilfsvariable schützt den zuerst gelesenen Wert.
verdoppeln(a) erhält eine Liste ganzer Zahlen und gibt eine neue Liste mit jedem Wert mal 2 zurück. Reihenfolge und Länge bleiben erhalten; die Eingabe bleibt unverändert. Auch [] ist erlaubt.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Eine neue Ergebnisliste beginnt leer und wächst um einen Wert je Eingabeelement.
append(2 * wert) hängt genau einen verdoppelten Wert hinten an.
Lösung anzeigen
def verdoppeln(a):
ergebnis = []
for wert in a:
ergebnis.append(2 * wert)
return ergebnis
BPE 7J23 Punkteanspruchsvoll
Eine Liste ihrer Positionen bilden
Noch nicht begonnen
Aufgabenstellung
indizes(a) gibt eine neue Liste aller gültigen nichtnegativen Indizes von a zurück. Beispiel: indizes([40, 40, 2]) liefert [0, 1, 2], nicht die Werte. Die Eingabe bleibt unverändert.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Die gespeicherten Werte bestimmen nicht, welche Positionen existieren.
range(len(a)) erzeugt genau die benötigten Positionen.
Lösung anzeigen
def indizes(a):
ergebnis = []
for i in range(len(a)):
ergebnis.append(i)
return ergebnis
BPE 7J23 Punkteanspruchsvoll
Eine Indexgrenze prüfen
Noch nicht begonnen
Aufgabenstellung
gueltiger_index(a, i) erhält eine Liste und eine ganze Zahl. Liefere den Wahrheitswert True genau für 0 ≤ i < len(a), sonst False. Negative Python-Indizes sind hier ausdrücklich nicht erlaubt; keine Listenelemente verändern.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Ein erlaubter Index darf weder negativ sein noch die Länge erreichen.
Verbinde i >= 0 und i < len(a); die leere Liste hat keinen passenden Index.
Lösung anzeigen
def gueltiger_index(a, i):
return 0 <= i < len(a)
BPE 7J23 Punkteanspruchsvoll
Kopieren passend zum Datentyp
Noch nicht begonnen
Aufgabenstellung
Eine Liste enthält ausschließlich ganze Zahlen. Eine Funktion soll einen Platz ersetzen, ohne die Eingabe zu verändern. Welche Vorbereitung erfüllt das?
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Hier geht es um das Ersetzen eines Listenplatzes, nicht um das Ändern verschachtelter Objekte.
Nur die Kopieroperation erzeugt ein zweites Listenobjekt.
Lösung anzeigen
a.copy() erzeugt eine unabhängige äußere Liste. Für das Ersetzen ihrer Zahlenwerte reicht das; eine einfache Zuweisung erzeugt dagegen einen zweiten Namen für dieselbe Liste.