Kopieren von Variablen

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
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

ich weiß mir nicht mehr zu helfen, aber vielleicht hat ja jemand von euch eine
Idee.

Folgendes Problem: Der untenstehende Code ist aus einem GUI von mir - und zwar
aus einem File-Dialog (nehmt einmal an, die Einrückung stimmt, wenn sie denn
wieder verrutscht sein sollte). Wenn der Anweder eine Datei auswählt, so soll
ein best. Objekt initialisiert werden (mit Parametern aus der Datei). Das
funktioniert auch. Dieses Objekt wird an die Liste "datasets" gehangen.

Wenn der Anwender nun noch eine Datei öffnen will, so möchte ich
sicherstellen, daß nicht zweimal dasselbe angezeigt wird. Also überprüfe ich,
ob ein Objekt gleichen Namens schon existiert. Dies geschieht über die Liste
self.active_datasets, die in der ganzen Anwendung bekannt ist. Und zwar
passiert das auch schon bei der ersten Datei, die geöffnet wird: Name noch
nicht in self.active_datasets? (weil leer) - dann wird es drangehangen.

Der Code:

Code: Alles auswählen

:
#Vorgeplaenkel:
datasets = []
if file_dialog.ShowModal() == wx.ID_OK:
            paths = file_dialog.GetPaths()
            for path in paths:
<snip>
                elif path[-4:] == '.out':
                    x = SAXSdata().fromGNOM(path)
                    datasets.append(x)
<snip>
file_dialog.Destroy()
print '====='
            
names = [x.get_name() for x in self.active_datasets]
print names
for x in datasets:
    print x.get_name()
    if not (x.get_name() in names):
        self.active_datasets.append(x)
    print datasets
    print self.active_datasets
Die Ausgabe (mit Kommentar):
===== #erster Durchlauf
[] #self.active_datasets ist noch eine Leere Liste - also auch names
270_oxy #Name des einzigen Elementes in datasets
[<lib.Data.SAXSdata instance at 0x1313d40>] #Liste datasets mit
Speicheradresse des Objektes
[<lib.Data.SAXSdata instance at 0x1313d40>] #Liste self.active_datasets mit
Speicheradresse des Objektes
=====
[u'285_oxy'] #Namen in self.active_datasets - WIESO NAME DES ZWEITEN FILES?
285_oxy #Name des einzigen Elementes in datasets
[<lib.Data.SAXSdata instance at 0x2aaaba264998> ]#Liste datasets mit
Speicheradresse des Objektes
[<lib.Data.SAXSdata instance at 0x1313d40>] #Liste self.active_datasets mit
Speicheradresse des Objektes

Eigentlich sollte das neue Element in datasets an self.active_datasets
gehangen werden, da die Namen der Elemente in den Listen nicht gleich sind.
Aber aus irgendeinem Grund findet sich der Name (und andere Daten) beim
zweiten Aufruf der Funktion schon in self.active_datasets. Ist damit gleich
dem Namen des Elementes in datasets und dieses Element wird nicht an
self.active_datasets gehangen.
Unbegreiflich, da datasets am Ende der Funktion das Leben aushaucht und
self.active_datasets (ist überprüft) niergendwo anders manipuliert wird.

Das Witzige ist: Das geschieht nur bei Dateien eines Formates. Wenn ich ein
anderes Format öffne, wird das Objekt auf andere Weise erstellt - das
resultierende Objekt ist aber vom gleichen Typ - und ohne Probleme an
self.active_datasets angehangen. (Die zum Lesen der Dateien aufgerufenen
Funktionen (fromXXX-Typ, s. oben) kennen aber die beiden relevanten Listen
gar nicht.)

Woran kann es liegen? (Ich zeige allen relevanten Code.)

Christian
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Ich bin jetzt nicht ganz sicher, ob ich alles verstanden hab, aber zwei Dinge fallen mir auf:

1.
zuerst

Code: Alles auswählen

datasets.append(x)
und dann

Code: Alles auswählen

self.active_datasets.append(x)
2.
CM hat geschrieben: [<lib.Data.SAXSdata instance at 0x1313d40>] #Liste datasets mit
Speicheradresse des Objektes
[<lib.Data.SAXSdata instance at 0x1313d40>] #Liste self.active_datasets mit
Speicheradresse des Objektes
Selbe Speicheradresse. Sieht für mich aus, als würde da irgendwas mit Deinem x schief laufen. Sehe aber nicht, was es sein könnte. Gibt es die erste Zeile vielleicht doch noch anderswo?
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Halleluja! Jetzt habe ich wirklich mehrere Tage daran gebastelt und habe wirklich Zeit darauf verwendet das Problem so weit einzugrenzen, daß ich es auf diese paar Codezeilen eindampfen konnte, die ich hier gezeigt habe.

N317V, Du hast mir zwar nicht die Lösung gezeigt, aber den Finger in die Wunde gelegt, so daß es jetzt noch mal richtig weh tat ;-).
Die Lösung also:

Code: Alles auswählen

self.active_datasets.append(copy.deepcopy(x))
Ich denke auf diese Weise sollte auch allen weiteren Eventualitäten (und ich möchte ja schon noch mal weiter coden in dem Bereich) vorgesorgt sein.

Vielen Dank,
Christian

PS ... und ja: Der Threadname hätte besser gewählt sein können.
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

CM hat geschrieben:N317V, Du hast mir zwar nicht die Lösung gezeigt, aber den Finger in die Wunde gelegt, so daß es jetzt noch mal richtig weh tat ;-).
Meine besondere Spezialität in allen Lebenslagen. :twisted:
Außerdem: Hilfe zur Selbsthilfe! Perfekt, oder? :P
CM hat geschrieben:Der Threadname hätte besser gewählt sein können.
Nö, eigentlich enthält er bereits die Lösung. *LOL*
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Antworten