2D Liste - Wert ändern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
PPaB
User
Beiträge: 7
Registriert: Donnerstag 24. November 2011, 18:57

Hallo zusammen,

ich möchte in Python eine zweidimensionale Liste erzeugen und dort einen Wert ändern.
Wenn ich die Liste komplett vorgebe bzw erstelle, dann funktioniert das auch ohne Probleme.
Wenn ich aber mit einer Schleife die Listen in der Liste hinzufüge, komm ich zwar auch auf die gleiche Liste, aber beim ändern eines Wertes, werden in allen Unterlisten der eine Wert geändert. Gibt es da irgendeinen Trick, wie ich das hinbekomme, bzw benutze ich vielleicht einfach nur die falsche Funktion zum einfügen?
Ich benutze Python 3.

Hier mal ein Beispiel, im ersten Fall funktioniert es ohne Probleme, im zweiten werden 2 'x' gemacht, obwohl ich genau das gleiche Feld geändert habe.

Kann mir jemand helfen?

Code: Alles auswählen

liste = [['_','_'],['_','_']]
liste[0][0] = 'x'
print(liste)

Code: Alles auswählen

Ausgabe:
[['x', '_'], ['_', '_']]

Code: Alles auswählen

liste = []
teilliste = []
for j in range(2):
    teilliste[len(teilliste):] = ['_']
for i in range(2):
    liste[len(liste):] = [teilliste]

liste[0][0] = 'x'
print(liste)

Code: Alles auswählen

Ausgabe:
[['x', '_'], ['x', '_']]
BlackJack

@PPaB: Woah, ist das gruselig. Wie bist Du denn auf diese verquere Idee gekommen!? ``a_list[len(a_list):] = [item]`` ist die wohl umständlichste Art ``a_list.append(item)`` zu schreiben, die mir bis jetzt unter gekommen ist.

Das Problem ist, dass Du in der zweiten Schleife zweimal die *selbe* `teilliste` an die `liste` anhängst. Wenn Du diese *eine* Liste änderst, dann ist das natürlich überall sichtbar wo auf diese Liste zurück gegriffen wird.

Der übliche Weg zweidimensionale Listen anzulegen bei denen die innersten Objekte aus unveränderlichen (!) Objekten besteht, sieht so aus:

Code: Alles auswählen

liste = [['_'] * 2 for _ in range(2)]
PPaB
User
Beiträge: 7
Registriert: Donnerstag 24. November 2011, 18:57

achso das erste war nur, weil ich testen wollte, ob es vielleicht so funktioniert, deswegen das ``a_list[len(a_list):] = [item]``. Hatte nur im Internet gefunden, dass es das gleich besagt, wie append. Hatte es vorher auch mit append, also keine Sorge, so gruselig bin ich nicht ;)

Ok, da hast du recht, call by reference ist ja ganz nett, nur sollte man sich dessen bewusst sein :D

Vielen Dank
Zuletzt geändert von PPaB am Donnerstag 24. November 2011, 23:04, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

PPaB hat geschrieben:[...] call by reverence [...]
"Call by reverence" ist nur bei Vatical vorgesehen, Python beschränkt sich auf das übliche "Call by reference".
Antworten