Seite 1 von 1

Ein richtiges zweidimensionales Array

Verfasst: Montag 7. Juni 2004, 00:13
von pllk
Ich möchte ein zweidimensionales Array (z.B. 5 x 5) definieren. Mit folgendem Code geht es schon ganz gut:

Code: Alles auswählen

r = [[0] * 5] * 5
Und das neue Array sieht folgendermaßen aus:

Code: Alles auswählen

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
Dann möchte ich einen Wert im Array verändern. So habe ich geschrieben:

Code: Alles auswählen

r[1][3] = 3
Das Resultat ist aber:

Code: Alles auswählen

[[0, 0, 0, 3, 0], [0, 0, 0, 3, 0], [0, 0, 0, 3, 0], [0, 0, 0, 3, 0], [0, 0, 0, 3, 0]]
Statt:

Code: Alles auswählen

[[0, 0, 0, 0, 0], [0, 0, 0, 3, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
Ich möchte doch nur den Wert [1][3] verändern, nicht alle fünf Werte im Array. Weiß jemand, woher das kommt und wie ich mein Programm korrigieren sollte?

Verfasst: Montag 7. Juni 2004, 08:05
von Milan
Hi. Das der Effekt auftritt ist ganz klar: du speicherst nicht etwa fünf Kopien einer Liste ineinander, sondern 5 Referenzen auf eine Liste. Es herrscht also Identität zwischen den Listen. Um das zu vermeiden, würde ich den "*" Operator nicht verwenden, sondern so vorgehen:

Code: Alles auswählen

f=lambda liste,n:[liste[:] for i in xrange(n)]
r=f([0],5)
r=f(r,5)
Mit liste[:] wird eine Kopie erstellt, statt eine Referenz zu übergeben.

Oder, etwas nicht ganz so sauberes: du erstellst erst die verschachtelte Struktur und wandelst sie in einen String um und wieder zurück...

Code: Alles auswählen

r=[[5] * ] * 5
r=eval(repr(r))
Ist aber nicht ganz so sauber, da repr nur Objekte in Strings verwandeln kann, die auch selber __repr__ implementiert haben. Besser du fährst den Weg über Kopien.

Verfasst: Montag 7. Juni 2004, 11:01
von Gast
Jetzt funktioniert mein Programm, wie ich mir vorgestellt habe. Vielen Dank für die Antwort!

Verfasst: Montag 7. Juni 2004, 19:40
von wuf
Hallo pllk

Hier wäre noch eine weitere Möglichkeit einen
mehrdimensionalen Listen-Array zu erstellen.

Code: Alles auswählen

elements   = 5
dimensions = 5
inititem   = 0
myarray    = []

for i in xrange(dimensions):
	myarray += [[inititem]*elements]

myarray[1][3] = 3
print myarray
Gruss wuf :wink: