Zuweisungs-Problem mit mehrdimensionaler Liste

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
andy

# Hallo Leute, bin auf ein Problem gestossen
# mit dem ich nicht so recht klarkomme.
# Evtl. kann mir einer von euch erklaeren
# was hier falsch laeuft.

# Man erzeuge eine mehrdimensionale Liste
# mit Multiplikatoren etwa wie folgt:

>>> x=[[0]*3]*2
>>> x
[[0, 0, 0], [0, 0, 0]]
>>> x[1][1]=7 # ein Element soll veraendert werden
>>> x
[[0, 7, 0], [0, 7, 0]] # aber zwei Elemente bekommen die 7



# Wenn man dagegen die Initialisierung
# auf folgende Art macht ist alles o.k.

>>> x=[[0, 0, 0], [0, 0, 0]]
>>> x
[[0, 0, 0], [0, 0, 0]]
>>> x[1][1]=7
>>> x
[[0, 0, 0], [0, 7, 0]] # nur ein Element bekommt die 7
>>>



# is it a bug or a feature?

# Sollte das jetzt was Dummes gewesen sein,
# so moege man mir verzeihen, bin Anfaenger!!

# Obiges Beispiel wurde unter:
Python 2.4.1 (#65, Mar 30 2005, 09:13:57) [MSC v.1310 32 bit (Intel)] on win32
# ausgefuehrt (gleicher Effekt unter Linux)

# Vielen Dank für eure Hilfe.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Also das ist weil er bei der 1. Version zuerst [0,0,0] erstellt ([0]*3). Und dann macht er 2*[0,0,0] -> daher erstellt er keine neue Liste, sondern die beiden Elemente der Liste zeigen 2mal auf die gleiche Liste (auf [0,0,0]).

Also kommts nicht darauf an ob du x[0] oder x[1] ansprichst, weil es beides mal die gleiche Liste ist.

ein kleines Beispiel:

Code: Alles auswählen

a = []
b = a
b.append(33)

print a
print b
Hier zeigen auch a und b auf die selbe Liste, genau gleich gehts bei der Liste wenn du sie mit * kopierst.

Gruss
andy

Danke fuer deine schnelle Antwort
Antworten