2009-12-24 13 views
10

Python:Python-Liste Problem

m=[[0]*3]*2 
for i in range(3): 
    m[0][i]=1 

print m 

Ich gehe davon aus, dass dieser Code

[[1, 1, 1], [0, 0, 0]] 

drucken soll, aber er druckt

[[1, 1, 1], [1, 1, 1]] 

Antwort

14

Das ist von Entwurf. Wenn Sie Multiplikation für Elemente einer Liste verwenden, reproduzieren Sie die Referenzen.

Siehe the section "List creation shortcuts" on the Python Programming/Lists wikibook, die ausführlich auf die Probleme mit Listenverweisen auf veränderbare Objekte eingeht.

Ihre empfohlene Problemumgehung ist eine Liste Verständnis:

>>> s = [[0]*3 for i in range(2)] 
>>> s 
[[0, 0, 0], [0, 0, 0]] 
>>> s[0][1] = 1 
>>> s 
[[0, 1, 0], [0, 0, 0]] 
6

Das ist ein bisschen teuflisch, aber ganz offensichtlich, wenn Sie verstehen, was du tust. Wenn Sie das [[0]*3]*2-Bit erstellen, erstellen Sie zuerst eine Liste mit 3 Nullen und kopieren sie dann, um zwei Elemente zu erstellen. Wenn Sie diese Kopie erstellen, erstellen Sie jedoch keine neuen Listen mit demselben Inhalt, sondern verweisen mehrmals auf dieselbe Liste. Wenn du also eins änderst, ändern sich alle.

Ein Beispiel um es zu markieren:

In [49]: s = [[]]*2 # Create two empty lists 

In [50]: s # See: 
Out[50]: [[], []] 

In [51]: s[0].append(2) # Alter the first element (or so we think) 

In [52]: s # OH MY, they both changed! (because they're the same list!) 
Out[52]: [[2], [2]]