2017-07-21 2 views
0

Sehr einfaches Python, ich erstelle nur ein neues Listenobjekt, indem ich die alte Liste kopiere. Mit der Methode .copy() dachte ich, dass es ein neues Objekt in Python basierend auf dem offiziellen Dokument erstellen sollte: https://docs.python.org/3.6/library/stdtypes.html?highlight=list#list Wie kommt es, nachdem ich die Elemente im neuen Objekt aktualisiert habe, wurden auch die Elemente im alten Listenobjekt geändert.Warum ist das alte Objekt auch geändert worden, wenn ich ein neues Objekt nach list.copy() aktualisiert habe

old = [[1, 1, 1], 
     [1, 1, 1], 
     [1, 1, 1], 
     [1, 1, 1]] 

print(old) 
new = old.copy() 
for i in range(len(new)): 
    for j in range(len(new[0])): 
     new[i][j] = 0 
print(old) 
print(new) 

Wie kommt der Ausgang ist, wo ich den alten Wert erwarten sollte nicht geändert werden:

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

'list.copy' erstellt eine flache Kopie. Wenn also die äußere Liste Listen enthält, bezieht sich die neue Liste immer noch auf die alten inneren Listen. Wenn Sie 'deepcopy' nicht importieren wollen, können Sie dies tun, um Kopien der inneren Listen zu erstellen: 'new = [u [:] für u in old]'. –

Antwort

5

Kopieren funktioniert nur mit einer Dimension Listen. Für eine bessere Lösung, die unabhängig von der Anzahl der Dimensionen arbeitet verwenden deepcopy:

from copy import deepcopy 

old = [[1, 1, 1], 
     [1, 1, 1], 
     [1, 1, 1], 
     [1, 1, 1]] 

print(old) 
new = deepcopy(old) 
for i in range(len(new)): 
    for j in range(len(new[0])): 
     new[i][j] = 0 
print(old) 
print(new) 

Und Sie haben:

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

Hoffe, es hilft!

0

Versuchen [copy.deepcopy][1] oder

from copy import deepcopy 
new = deepcopy(old) 

von der Quelle

Eine flache Kopie erstellt ein neues zusammengesetztes Objekt und dann (soweit möglich) fügt Referenzen in sie zu den in den ursprünglichen gefundenen Objekten. Eine tiefe Kopie erstellt ein neues zusammengesetztes Objekt und fügt dann rekursiv Kopien der Objekte in das Original ein.

Verwandte Themen