Not logged in. · Lost password · Register

yellowmoneybank
Member since Apr 2018
4 posts
Subject: Stretch Matrix
Hallo,
ich bearbeite gerade Blatt 1 und habe folgenden Code für die Methode stretch_matrix():
def stretch_matrix(s, d):
    matrix = [[0] * d] * d

    n = 0
    for i in matrix:
        i[n] = s
        n += 1
    return np.array(matrix)
Für den Aufruf von beispielsweise stretch_matrix(3,3) würde ich als Ergebnis [[3,0,0],[0,3,0],[0,0,3]] erwarten, tatsächlich bekomme ich als Ergebnis aber [[3,3,3], [3,3,3], [3,3,3]].

Könnte mir jemand erklären, was da genau passiert?

Vielen Dank schonmal
yq53ykyr
Member since Oct 2016
84 posts
Im Moment, in dem du
[x] * 4
schreibt, erhälst du in Python die Liste [x, x, x, x]. Dies ist eine Liste mit vier Referenzen auf dasselbe x. Wird nun dieses x modifiziert, so passiert das auch bei allen anderen Auftritten von x.
Deine Liste an Listen matrix besteht also aus d Auftritten derselben Liste [0] * d. Python evaluiert beim Ausführen diesen Codeteil genau einmal zu Beginn und gibt dann eine Liste wie oben beschrieben zurück.
Aber, wenn ich a = [2] * 6 gefolgt von a[0] = 1 ausführe erhalte ich ja auch [1,2,2,2,2,2] und nicht etwa [1,1,1,1,1,1]. Das stimmt, hier wird allerdings nicht das Element selbst verändert, sondern bloß auf ein anderes Element gezeigt. Die oben erklärte Magie des Multiplikationsoperators stimmt auch weiterhin.
Interessanterweise kopiert der Operator hier nie irgendwelche Elemente, auch nicht bei immutable Objekten (wie Integer oder ähnliche). Da diese aber immutable sind, kommt es hier selten zu Verwirrungen (obiges Fallbeispiel funktionierte ja nicht, da das Objekt unveränderbar ist).

Vielleicht hilft ja auch das hier: http://pythontutor.com/visualize.html#code=size%20%3D%203%… Hier wird effektiv derselbe Code ausgeführt, also die kritische Zeile zumindest, und danach das Pointer-Layout (also wie die Liste genau gespeichert ist) graphisch dargestellt.
yellowmoneybank
Member since Apr 2018
4 posts
Vielen Dank für deine ausführliche Antwort!
Das hat mir sehr weitergeholfen, ich hatte schon an meinem Verstand gezweifelt.
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Go to forum
Datenschutz | Kontakt
Powered by the Unclassified NewsBoard software, 20150713-dev, © 2003-2011 by Yves Goergen