Seltsames Listenverhalten

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
zoe
User
Beiträge: 8
Registriert: Donnerstag 29. März 2007, 10:28

Samstag 19. Januar 2008, 14:00

Hi, ich bin auf ein komisches Problem gestossen:

Code: Alles auswählen

>>>l = [2,4,5,6,7]
>>>a1 = l
>>>a1
[2, 4, 5, 6, 7]
>>> a2 = l
>>> a2
[2, 4, 5, 6, 7]
>>> a2.remove(4)
>>> a2
[2, 5, 6, 7]
>>> a1
[2, 5, 6, 7]
>>> l
[2, 5, 6, 7]
Ich persönlich hätte jetzt erwartet das nur die Liste a2 von dem remove betroffen ist aber scheinbar erstellt das '=' eher einen pointer als eine Kopie von l ?

Ich fürchte mal das dieses Verhalten gewollt ist frage mich dann aber wie an eine Kopie erstellt ?

Danke !
BlackJack

Samstag 19. Januar 2008, 14:21

Das Verhalten ist gewollt. Zuweisungen binden (neue, zusätzliche) Namen an vorhandene Objekte. In Python wird nichts automatisch kopiert.

Flache Kopien von Listen kann man mit ``kopie = original[:]`` oder IMHO etwas lesbarer mit ``kopie = list(original)`` erstellen.

Für Kopien allgemein gibt's das `copy`-Modul. Das sieht man allerdings selten im Einsatz. Wenn man das häufig "braucht", sollte man sich noch einmal Gedanken über den Entwurf machen.
zoe
User
Beiträge: 8
Registriert: Donnerstag 29. März 2007, 10:28

Samstag 19. Januar 2008, 15:22

Schonmal gut zu wissen, danke ;)

Wie würde ein Entwurf denn aussehen wenn man zusätzlich zur original Liste eine Kopie der Liste benötigt die man ohne Auswirkungen auf das Original modifizieren kann ?
BlackJack

Samstag 19. Januar 2008, 16:04

In dem Fall macht man eine Kopie. Es geht darum, das man etwas "falsch" macht, wenn man so etwas häufig braucht. Das *kann* ein Zeichen für einen Entwurf sein, der nicht so zu Python passt. Wie man das anders löst, hängt vom konkreten Fall ab.
Antworten