Seite 1 von 1

Seltsames Verhalten einer 2-dimensionalen Liste

Verfasst: Donnerstag 14. Oktober 2010, 13:02
von KlausMerkert
Liebe Python-Fachleute,

ich bin auf ein seltsames Verhalten einer Liste gestoßen, das ich mir nicht erklären kann. Je nachdem wie ich die Liste erzeuge, ergibt sich später bei der Änderung eines Elementes, dass mehrere Elemente geändert werden oder nur das eine. Es scheint so zu sein, dass ein dynamisches Erzeugen der Liste (siehe f1) den Fehler provoziert. Erstelle ich die Liste direkt (siehe f), so bleibt der Fehler aus. Ich bin schon etwas verwirrt, zumal Python die beiden Listen für gleich hält. Kann mir jemand einen Tipp geben? Gerne lese ich auch irgendetwas nach, wenn ich weiß, wo.

Viele Grüße

Klaus Merkert

Code: Alles auswählen

zeile = [6,6,6,6]                   # nicht ok
f1 = []
for i in range(3):
    # f.append(zeile) 
    f1 = f1 + [zeile]

f = [[6,6,6,6],[6,6,6,6],[6,6,6,6]] # ok

"""
f = []                              # ok
for i in range(3):
    f = f + [[6,6,6,6]]
"""
"""
f = [[6]*4]*3                       # nicht ok
"""
"""
zeile = list(((6,)*4))              # nicht ok
f = []                              
for i in range(3):
    f = f + [zeile]
"""
print('f==f1?',f==f1)
print('mit f1 nicht ok')
print(f1)
f1[0][2] = 1
print(f1)
print('mit f ok')
print(f)
f[0][2] = 1
print(f)
ergibt die Ausgabe

Code: Alles auswählen

>>> 
f==f1? True
mit f1 nicht ok
[[6, 6, 6, 6], [6, 6, 6, 6], [6, 6, 6, 6]]
[[6, 6, 1, 6], [6, 6, 1, 6], [6, 6, 1, 6]]
mit f ok
[[6, 6, 6, 6], [6, 6, 6, 6], [6, 6, 6, 6]]
[[6, 6, 1, 6], [6, 6, 6, 6], [6, 6, 6, 6]]
>>> 

Re: Seltsames Verhalten einer 2-dimensionalen Liste

Verfasst: Donnerstag 14. Oktober 2010, 13:08
von lutz.horn
Egal wie oft Du 'zeile' verwendest, es handelt sich immer um die selbe Liste. Wenn Du eines ihrer Elemente änderst, wird diese Änderung auch überall sonst, wo auf sie verwiesen wird, sichtbar.

Re: Seltsames Verhalten einer 2-dimensionalen Liste

Verfasst: Donnerstag 14. Oktober 2010, 13:10
von Panke
So wie Du die Liste per Schleife erstellst, ist in der Ergebnisliste eine einzige Liste dreifach
enthalten.

Code: Alles auswählen

zeile = [6,6,6,6]                   # nicht ok
f1 = []
for i in range(3):
    # f.append(zeile) 
    f1 = f1 + [zeile]

print f1[0] is f1[1]

Re: Seltsames Verhalten einer 2-dimensionalen Liste

Verfasst: Donnerstag 14. Oktober 2010, 13:16
von KlausMerkert
Lieber Lutz Horn,

vielen Dank für den Hinweis, darauf hätte ich eigentlich kommen müssen.
So funktioniert es:

Code: Alles auswählen

zeile = [6,6,6,6]                   
f = []
for i in range(3):
    f.append(zeile[:])    

print(f)
f[0][2] = 1
print(f)
Viele Grüße

Klaus Merkert

Re: Seltsames Verhalten einer 2-dimensionalen Liste

Verfasst: Donnerstag 14. Oktober 2010, 13:18
von cofi
KlausMerkert hat geschrieben:Ich bin schon etwas verwirrt, zumal Python die beiden Listen für gleich hält.
Es waere etwas schwierig, wenn gleiche Listen nicht gleich waeren. Du solltest dich - wie lutz.horn und Panke schon angedeutet haben - mit dem Unterschied von Identitaet, zwei Objekte sind ein und dasselbe Objekt, und Gleichheit, zwei Objekte enthalten die gleichen Informationen, vertraut machen.

List Comprehensions sind hier sehr nuetzlich:

Code: Alles auswählen

two_dim = [[6,6,6] for _ in xrange(3)]

Re: Seltsames Verhalten einer 2-dimensionalen Liste

Verfasst: Donnerstag 14. Oktober 2010, 13:30
von KlausMerkert
Vielen Dank cofi für den guten Tipp.

Viele Grüße

Klaus Merkert