"Sichern" von Listen

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
Bonsai
User
Beiträge: 17
Registriert: Montag 20. August 2012, 10:25

Montag 5. November 2012, 08:03

Hallo Leute, :)
ich kämpfe gerade wieder mit einem kleinen Python Problem. Ich habe 2 relativ große Listen, auf welche ich eine Methode zur Überprüfung eines Vorgangs anwenden muss. Diese Methode verändert den Inhalt dieser Liste, ich brauche nach der Methode aber wieder den gleichen Inhalt wie vor der Methode. Also habe ich mir gedacht, speicher ich doch einfach mal die Werte der Listen in 2 andere Platzhalter und hole mir nach der Methode wiederum von diesen die Werte für meine eigentlichen Listen.
So weit, so gut, dass Problem ist bloß, dass Übertragen von Listen mit = in Python wohl nicht funktioniert, warum auch immer. Da ich das Gleiche Problem aber schonmal hatte, wusste ich eine Lösung, nämlich die Python-Methode extend. Das Problem bei extend ist nur, dass scheinbar viel zu viel Rechenleistung verbraucht wird und mein Programm abstürzt.

In Code ausgedrückt:
funktioniert nicht:

Code: Alles auswählen

temp_liste1 = []
temp_liste2 = []
liste1 = [x,y,[v,w,z], usw...]
liste2 = [x,y,1,1,a,g[v,w,z],b, usw...]

temp_liste1 = liste1
temp_liste2 = liste2
liste1.methode()
liste2.methode
liste1 = []
liste2 = []
liste1 = temp_liste1
liste2 = temp_liste2
überfordert Rechner:

Code: Alles auswählen

temp_liste1 = []
temp_liste2 = []
liste1 = [x,y,[v,w,z], usw...]
liste2 = [x,y,1,1,a,g[v,w,z],b, usw...]

temp_liste1.extend(liste1)
temp_liste2.extend(liste2)
liste1.methode()
liste2.methode
liste1 = []
liste2 = []
liste1.extend(temp_liste1)
liste2.extend(temp_liste2)
Über einfache und schnelle Lösungsvorschläge wäre ich sehr dankbar!

Danke schonmal,
Bonsai
Benutzeravatar
pillmuncher
User
Beiträge: 1155
Registriert: Samstag 21. März 2009, 22:59
Wohnort: München

Montag 5. November 2012, 08:58

@Bonsai: Zuweisung in Python funktioniert nicht so, wie du denkst. Variablen in Python sind bloß Namen die mit Objekten assoziiert sind. Eine Zuweisung bedeutet deswegen nichts anderes als "ich habe hier ein Objekt, und dieses Objekt möchte ich ab jetzt unter diesem Namen ansprechen". Wenn du also Code wie diesen hast:

Code: Alles auswählen

a = b
dann sagst du damit: "Das Objekt, das ich bisher unter dem Namen b angesprochen habe, möchte ich ab jetzt auch unter dem Namen a ansprechen". Du hast dann einfach nur zwei unterschiedliche Namen für dasselbe Objekt. Wenn du anschließend das Objekt modifizierst, indem du mit dem einen Namen darauf zugreifst, ist das Objekt, auf das du unter dem anderen Namen zugreifst, ebenfalls modifiziert, ganz einfach, weil es sich um dasselbe Objekt handelt. Wenn du eine Kopie von dem Objekt anlegen möchtest, dann musst du das in Python explizit hinschreiben:

Code: Alles auswählen

a = [1, 2, 3]
b = list(a)
a.append(4)
assert a is not b
Damit erzeugst du allerdings nur eine flache Kopie. Beispiel:

Code: Alles auswählen

a = [[1, 2], [3, 4]]
b = list(a)
a[0].append('hallo')
assert a is not b
assert a[0] != b[0]
Hierbei erzeut die letzte Zeile eine Exception, weil a und b zwar selbst unterschiedliche Objekte sind, aber dieselben Objekte als Listenelemente beinhalten. Das kannst du umgehen indem du copy.deepcopy() verwendest:

Code: Alles auswählen

import copy
a = [[1, 2], [3, 4]]
b = copy.deepcopy(a)
a[0].append('hallo')
assert a is not b
assert a[0] != b[0]
Diesmal fliegt keine Exception. Mehr dazu, wie Variablen in Python funktionieren, steht hier: http://docs.python.org/2.7/reference/ex ... model.html
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

Montag 5. November 2012, 11:53

@Bonsai: Wenn beim kopieren der Liste das Programm abbricht, dann schau einfach mal auf die Ausnahme. Da wird dann nicht zu viel Rechenleistung verbraucht, sondern zu viel Speicher. Kein Programm stürzt ab weil es zu viel Rechenleistung braucht. Jetzt mal von Hardwareproblemen wie mangelnder Kühlung des Prozessors abgesehen.

Wenn das Programm bei einer Kopie der Listen zu viel Speicher benötigt, dann musst Du entweder die Daten nicht im Speicher halten, sondern zum Beispiel in einer Datenbank, oder versuchen Dir für die „Kopie” einen eigenen Datentyp zu speichern, der nur die Veränderungen zum Original speichert. Das wiederum macht nur Sinn wenn der Algorithmus nicht so viel verändert, dass der Speicher wieder knapp wird.
Bonsai
User
Beiträge: 17
Registriert: Montag 20. August 2012, 10:25

Montag 5. November 2012, 21:54

danke euch, die Idee mit dem copy hat geklappt!

da ich nun mittlerweile meine Facharbeit fertig habe und trotzdem Python noch nicht so wirklich durchschaut habe, muss ich wohl leider das Fazit ziehen, dass mir Python nicht so sehr liegt.
BlackJack

Montag 5. November 2012, 23:22

@Bonsai: Python verhält sich in dieser Frage aber nicht ungewöhnlich. Bei C#, Java, JavaScript, und einem ganzen Haufen anderer moderner Programmiersprachen hätte man genau das gleiche „Problem”. Bei C im Grunde auch. Denn auch wenn man dort mit dem Zuweisungsoperator tatsächlich Werte von zusammengesetzten Datenstrukturen kopieren kann, dürfte das spätestens bei unregelmässigen, verschachtelten Strukturen eine flache Kopie werden, weil man dann mit Pointern arbeiten würde und damit eine ähnliche Semantik wie bei den vorgenannten Sprachen bekommt.
Bonsai
User
Beiträge: 17
Registriert: Montag 20. August 2012, 10:25

Dienstag 6. November 2012, 20:34

das war jetzt auch nicht speziell auf dieses Problem bezogen, sondern ein generelles Fazit, was vermutlich auch gleichzeitig so eine Art Abschied aus diesem Forum war

by the way: ich finde es immer wieder klasse dass es solche Foren gibt und sich Informatiker gegenseitig helfen, hoffentlich bleibt das so!!!
Antworten