Seite 1 von 1
Listen Klonen funktioniert nicht
Verfasst: Donnerstag 12. August 2010, 14:09
von waXve
Hallo zusammen,
ich hoffe, ihr könnt mir sagen, warum ich eine Liste nicht Klonen kann.
Mit folgendem Beispiel funktioniert es:
Das ergebnis ist dann:
Genau so solls auch sein. Wenn ich allerdings
Code: Alles auswählen
a = ['hallo',[[1,2],['bla', 'blub']]]
b = a[:]
a [1][0][1] = 'test'
print b
print id(a)
print id(b)
mache, dann sieht die ausgabe so aus:
Code: Alles auswählen
['hallo', [[1, 'test'], ['bla', 'blub']]]
4299449336
4299777160
Woran kann das liegen? Ich bin völlig Ratlos, wie ich die Liste anders klonen sollte
Re: Listen Klonen funktioniert nicht
Verfasst: Donnerstag 12. August 2010, 14:18
von cofi
Das Slicing erzeugt eine _flache_ Kopie, d.h. die Referenzen zu anderen Listen werden kopiert und nicht auch aufgeloest.
Versuch mal
`copy.deepcopy`
Re: Listen Klonen funktioniert nicht
Verfasst: Donnerstag 12. August 2010, 14:22
von gkuhl
Bisschen Code zu Cofis Antwort:
Code: Alles auswählen
In [27]: a = [[1,2],[3,4]]
In [28]: b = copy.copy(a)
In [29]: c = copy.deepcopy(a)
In [30]: a[0][0] = 42
In [31]: a
Out[31]: [[42, 2], [3, 4]]
In [32]: b
Out[32]: [[42, 2], [3, 4]]
In [33]: c
Out[33]: [[1, 2], [3, 4]]
Grüße
Gerrit
Re: Listen Klonen funktioniert nicht
Verfasst: Donnerstag 12. August 2010, 14:27
von waXve
ich habs jetzt mit
versucht, erhalte aber einen Fehler:
Code: Alles auswählen
AttributeError: 'list' object has no attribute 'deepcopy'
Wie genau muss ich deepcopy anwenden? (Ich werde aus der doku nicht ganz schlau)
Muss ich noch was zusätzliches Einbinden?
Re: Listen Klonen funktioniert nicht
Verfasst: Donnerstag 12. August 2010, 14:30
von waXve
gkuhl hat geschrieben:Bisschen Code zu Cofis Antwort:
Code: Alles auswählen
In [27]: a = [[1,2],[3,4]]
In [28]: b = copy.copy(a)
In [29]: c = copy.deepcopy(a)
In [30]: a[0][0] = 42
In [31]: a
Out[31]: [[42, 2], [3, 4]]
In [32]: b
Out[32]: [[42, 2], [3, 4]]
In [33]: c
Out[33]: [[1, 2], [3, 4]]
Grüße
Gerrit
Ich bekomme immer noch gesagt, dass listen die methode copy() nicht unterstützen...
Re: Listen Klonen funktioniert nicht
Verfasst: Donnerstag 12. August 2010, 14:33
von Hyperion
gkuhl hat es doch schon gezeigt!
Aus der Doku:
copy.deepcopy(x)¶
Return a deep copy of x.
"copy" wird hier ja nicht das Listenobjekt sein, sondern "x". (Denn es wird ja eine tiefe Kopie von "x" zurückgeliefert).
Also wird "copy" wohl einfach das Modul sein

Re: Listen Klonen funktioniert nicht
Verfasst: Donnerstag 12. August 2010, 14:38
von waXve
*Brett gegen Kopfschlag Smily*
Stimmt. mit dem Code
Code: Alles auswählen
import copy
a = ['hallo',[[1,2],['bla', 'blub']]]
b = copy.deepcopy(a)
a [1][0][1] = 'test'
print b
print id(a)
print id(b)
funktioniert es einwandfrei. Dankeschön