Listen Klonen funktioniert nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
waXve
User
Beiträge: 4
Registriert: Donnerstag 12. August 2010, 14:02

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
Zuletzt geändert von waXve am Donnerstag 12. August 2010, 14:38, insgesamt 1-mal geändert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das Slicing erzeugt eine _flache_ Kopie, d.h. die Referenzen zu anderen Listen werden kopiert und nicht auch aufgeloest.

Versuch mal `copy.deepcopy`
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

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
waXve
User
Beiträge: 4
Registriert: Donnerstag 12. August 2010, 14:02

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?
waXve
User
Beiträge: 4
Registriert: Donnerstag 12. August 2010, 14:02

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...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
waXve
User
Beiträge: 4
Registriert: Donnerstag 12. August 2010, 14:02

*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
Antworten