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:

Code: Alles auswählen

a = [1,2,3]
b = a[:]
a [0] = 5
print b
Das ergebnis ist dann:

Code: Alles auswählen

[1,2,3]
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

Code: Alles auswählen

b = a.deepcopy()
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