Seite 1 von 1

Seltsames Listenverhalten

Verfasst: Samstag 19. Januar 2008, 14:00
von zoe
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 !

Verfasst: Samstag 19. Januar 2008, 14:21
von BlackJack
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.

Hmm

Verfasst: Samstag 19. Januar 2008, 15:22
von zoe
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 ?

Verfasst: Samstag 19. Januar 2008, 16:04
von BlackJack
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.