2012-04-14 4 views
1

ich eine Frage gestellt über einen 2-dimensionalen Array gestern Initialisierung dieses ist die Verbindung: How to implement this C++ source in python?Die Initialisierung von 2-dimensionalen Array in Python

Es gibt ein Problem in der Antwort erwähnt ein Freund einen Weg:

G = [[0]*11]*11 

aber auf diese Weise, wenn ich die G[0][0]-2 ändern, werden alle G[i][0](0<=i<11) werden alle Änderungen 2, aber ich weiß nicht, warum?

Ergänzung:

Das ist, was ich dachte: Die 0 oder andere Zahl ist immutable, also ändern wir eine von ihnen, die anderen nicht verändert werden. Aber die Liste [0, 0, 0, .....] ist mutable, wenn also [0, 0, ...] * 11, alle [0, 0, ...] Liste die sein wird Das Gleiche gilt für die Funktion is True. habe ich recht?

Antwort

4

Weil Sie 11 Referenzen auf die gleiche Liste haben.

G = [[0] * 11 for x in range(11)] 
+0

Ich füge eine Ergänzung in der Frage hinzu, stimmt das? –

+0

Ihre Schlussfolgerung ist richtig. –

2

Die *11 Notation macht 11 Verweise auf das gleiche Objekt. Wenn das Objekt unveränderlich ist, bemerken Sie es nicht, weil jeder Versuch, es zu ändern, den Verweis auf ein anderes Objekt ändert. Wenn das Objekt veränderbar ist, können Sie es ändern, indem Sie es beispielsweise einem Mitglied einer Liste zuweisen. Da alle Referenzen auf dasselbe Objekt verweisen, werden alle gleichzeitig geändert.

Veränderbar/unveränderlich scheint Dinge zu ändern, aber es ist nicht - Python ist in beiden Fällen konsistent. Betrachten Sie dieses Beispiel:

G[0] = [3]*11 

Sie werden sehen, dass G [1] nicht geändert hat.

+0

Entschuldigung, ich weiß nicht "Veränderbar/unveränderlich scheint Dinge zu ändern, aber es ist nicht - Python ist in beiden Fällen konsistent" bedeutet das? warum "alle Referenzen auf dasselbe Objekt gerichtet sind, werden alle gleichzeitig modifiziert" –