2017-04-19 1 views
-2

Ich habe eine Klasse in Python, die verwendet wird, um Parameterdateien für eine Software zu generieren. Diese Software wird in einem iterativen Prozess verwendet und erfordert für jede Iteration einen neuen Satz von Parameterdateien. Daher wird die Klasse PropGen aufgerufen, um die neuen Dateien unmittelbar vor jeder Iteration zu erstellen.Zwei OrderDict's in der Klassenfreigabe Objekt-ID enthalten, unabhängig von der Kopiermethode

Die Klasse füttert die Standardparameter für diese Dateien einmal vor dem gesamten Prozess und ändert dann die aktuelle Iteration, ändert diese Parameter und schreibt sie in die neue Datei. Die Art, wie ich dies bewerkstellige, besteht darin, die Voreinstellungen in einem zu speichern und einen anderen OrderedDictself.output_params zu erstellen, der die geänderten Werte sammelt, bevor er zum Schreiben in eine Datei verwendet wird.

Mein Problem ist, dass, egal wie ich die Werte self.params-self.output_params die beiden Wörterbücher bewegen die gleiche Objekt-ID und damit alle Änderungen an self.output_params in self.params wider. Bisher habe ich folgendes versucht:

EDIT Fehler mit fehlendem Aufruf von decopy am Ende der Datei gefunden.

+2

Was lässt Sie glauben, dass sie die gleiche Objekt-ID teilen? '==' prüft die Objektidentität nicht, es prüft * Gleichheit *. – BrenBarn

+0

Ich überprüfte auch mit 'id() ' – Grr

+3

Dann zeigen Sie bitte ein in sich geschlossenes Beispiel, das das tatsächliche Problem zeigt. Nichts in Ihrem geposteten Code zeigt tatsächlich, dass die Objekte die gleiche ID haben, und es ist unmöglich zu testen, da Ihre Beispiele nicht in sich abgeschlossen sind. – BrenBarn

Antwort

0

Das Problem ist in etwas, das Sie uns nicht gezeigt haben, also arbeiten Sie härter, um ein ausführbares Beispiel zur Verfügung zu stellen, das das Problem tatsächlich demonstriert. Zum Beispiel, können Sie dies ausführen können:

from collections import OrderedDict 

class C: 
    def __init__(self): 
     self.d1 = OrderedDict(a=1, b=2) 

    def copy(self): 
     self.d2 = self.d1.copy() 

c = C() 
c.copy() 
print(c.d1 is c.d2) 
c.d1['a'] = 666 
print(c.d1) 
print(c.d2) 

Für mich unter Python 2 oder 3, druckt es:

False 
OrderedDict([('a', 666), ('b', 2)]) 
OrderedDict([('a', 1), ('b', 2)]) 

Was es für Sie nicht drucken? Angenommen, es funktioniert für Sie, was nicht haben Sie uns über Ihren Code gezeigt?

+2

Also in Vorbereitung wie ein Beispiel kondensiert, wie ich konnte ich meinen Fehler gefunden. Ich hatte eine deepcopy weggelassen, als ich self.b in den ursprünglichen Zustand zurückgab. – Grr

Verwandte Themen