Seite 1 von 1

2D Liste - Wert ändern

Verfasst: Donnerstag 24. November 2011, 19:08
von PPaB
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', '_']]

Re: 2D Liste - Wert ändern

Verfasst: Donnerstag 24. November 2011, 19:39
von 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)]

Re: 2D Liste - Wert ändern

Verfasst: Donnerstag 24. November 2011, 20:21
von PPaB
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

Re: 2D Liste - Wert ändern

Verfasst: Donnerstag 24. November 2011, 20:49
von /me
PPaB hat geschrieben:[...] call by reverence [...]
"Call by reverence" ist nur bei Vatical vorgesehen, Python beschränkt sich auf das übliche "Call by reference".