2016-05-21 22 views
-1

Ich habe eine Liste von Listen in Python.Indizierung von Listen innerhalb einer Liste in Python

z=[[0]*6]*7 

Da alle Elemente 0 sind aber jetzt, wenn ich will ein einzelnes Element innerhalb einer Liste ändern, z

z[0][0]=2 

Dies sollte das erste Element der ersten Liste ändern. Aber es ändert tatsächlich das erste Element aller Elemente. Das ist so unlogisch für mich. Kann jemand helfen.

[2, 0, 0, 0, 0, 0], 
[2, 0, 0, 0, 0, 0], 
[2, 0, 0, 0, 0, 0], 
[2, 0, 0, 0, 0, 0], 
[2, 0, 0, 0, 0, 0], 
[2, 0, 0, 0, 0, 0]] 

Antwort

1

Das ist eine klassische "Programmierer Falle" in Python.

l = [ 0 ] * 6 

erstellt eine Liste sechsmal Referenz auf das Objekt gleichen Python enthält, hier die numerische Konstante 0.

Nun Einstellung

l[0] = 1 

wird ersetzen der erste Hinweis auf das const 0 Objekt durch einen Verweis auf ein anderes Objekt, das const 1 Objekt. Jetzt

, schauen wir uns an

z=[[0]*6]*7 

Diese erste erstellt eine Liste mit sechs Verweise auf das const 0 Objekt und erstellt dann eine Liste mit sieben Verweise auf diese einzelne Sechselementliste. Jetzt

,

z[0] 

geben Sie das erste Element aus z, die einfach die gleiche wie alle sechs anderen Elemente ist.

Beweis:

print id(z[0]) == id(z[1]) 

verschiedene Objekte unterschiedliche IDs haben.

Sie haben also nie eine Liste von verschiedenen Listen erstellt, sondern nur die gleiche Liste.

Sie können tatsächlich verschiedene Teil-Listen erstellen und sie in eine von jedoch so etwas wie

z = [ [0]*6 for _ in range(7) ] 

tun, habe ich das Gefühl, das man eigentlich möchten Matrizen verwenden - wenn das wirklich der Fall ist, numpy ‚s ndarray ist das, wonach Sie suchen, denn:

gibt Ihnen tatsächlich eine Matrix mit 42 numerischen Elementen.

Verwandte Themen