2017-04-19 5 views
-2

私は、ソフトウェアのパラメータファイルを生成するために使用されるPythonでクラスを持っています。このソフトウェアは反復プロセスで使用され、反復ごとに新しいパラメータファイルセットが必要です。したがって、クラスPropGenは、各反復の直前に新しいファイルを作成するために呼び出されます。2つのOrdereDictがコピーメソッドに関係なくクラス共有オブジェクトIDに含まれています

これらのファイルのデフォルトパラメータは、プロセス全体に渡って一度入力され、現在の反復でこれらのパラメータが変更され、新しいファイルに書き込まれます。私がこれを達成している方法は、デフォルト値をOrderedDictself.paramsに保存し、ファイルに書き込む前に変更された値を収集する別のOrderedDictself.output_paramsを作成することです。

私の問題は、私はself.paramsself.output_paramsに2つの辞書から値をどのように移動するかに関係なく、同じオブジェクトIDを持っているので、self.output_paramsへの変更がself.paramsに反映されていることです。これまで私は以下を試しました:

EDITファイルの最後にdeepcopyの呼び出しが見つかりませんでした。

class A(object): 
    def __init__(self): 
     self.a = OrderedDict({'a':1, 'b':2}) 
     self.b = deepcopy(self.a) 
     self.iter = 0 

    def do_some_work(self, key): 
     val = self.a[key]   
     self.b[key] = val.replace('#', self.iter) 

    def create(self): 
     lines = [] 
     for item in self.output_params.items(): 
      lines.append('='.join(item) + '\n') 
     with open(filename, 'w') as file_obj: 
      file_obj.writelines(lines) 
     # Here was the error 
     self.b = self.a 
     # should have been self.b = deepcopy(self.a) 
+2

あなたは彼らが同じオブジェクトIDを共有すると思いますか? '=='はオブジェクトのアイデンティティをチェックせず、* equality *をチェックします。 – BrenBarn

+0

私は 'id()'でも確認しています – Grr

+3

実際の問題を示す自己完結型の例を示してください。投稿されたコードの中にオブジェクトが同じIDを持っていることが実際に示されているわけではなく、あなたの例が自己完結型ではないためテストすることは不可能です。 – BrenBarn

答えて

0

この問題はあなたが私たちに示していないことにあります。したがって、問題を実際に実証する実行可能な例を提供することがより困難になります。たとえば、あなたがこの実行することができます:私にとって

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) 

を、Pythonの2または3の下で、それは印刷します

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

それはあなたのために何を印刷しませんの?それがあなたのために働いているとすれば、にあなたのコードを教えてくれませんでしたか?

+2

私は私のエラーを見つけることができたように凝縮した例として準備するので。私はself.bを元の状態に戻すときにディープコピーを省略しました。 – Grr

関連する問題