私は、ソフトウェアのパラメータファイルを生成するために使用されるPythonでクラスを持っています。このソフトウェアは反復プロセスで使用され、反復ごとに新しいパラメータファイルセットが必要です。したがって、クラスPropGen
は、各反復の直前に新しいファイルを作成するために呼び出されます。2つのOrdereDictがコピーメソッドに関係なくクラス共有オブジェクトIDに含まれています
これらのファイルのデフォルトパラメータは、プロセス全体に渡って一度入力され、現在の反復でこれらのパラメータが変更され、新しいファイルに書き込まれます。私がこれを達成している方法は、デフォルト値をOrderedDict
self.params
に保存し、ファイルに書き込む前に変更された値を収集する別のOrderedDict
self.output_params
を作成することです。
私の問題は、私はself.params
self.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)
あなたは彼らが同じオブジェクトIDを共有すると思いますか? '=='はオブジェクトのアイデンティティをチェックせず、* equality *をチェックします。 – BrenBarn
私は 'id()'でも確認しています – Grr
実際の問題を示す自己完結型の例を示してください。投稿されたコードの中にオブジェクトが同じIDを持っていることが実際に示されているわけではなく、あなたの例が自己完結型ではないためテストすることは不可能です。 – BrenBarn