Ein richtiges zweidimensionales Array

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
pllk
User
Beiträge: 1
Registriert: Sonntag 6. Juni 2004, 23:45
Wohnort: Helsinki/Finnland
Kontaktdaten:

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?
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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.
Gast

Jetzt funktioniert mein Programm, wie ich mir vorgestellt habe. Vielen Dank für die Antwort!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Antworten