2016-04-08 8 views
0

2つの辞書オブジェクトを1対1の対応で比較したいと思います。 dict fに更新がある場合はdict faと比較する必要があります。しかし私のコードでは、私がdict fを更新すると、dict faも更新されます。したがって、値は加算されますが、これは比較のためには意味がありません。誰も私にこれを助けることができますか?Python辞書の値の問題

def tym_save(node_add, data, f, fa, f2): 
    if str(node_add) in f: 
     # check for the older value 
     f2 = tym_check(f[str(node_add)],fa[str(node_add)],f2) 
    else: 
     f[str(node_add)] = data 
     fa = f 
     print 'f-> ', f, 'fa-> ', fa 
    return f, fa, f2 
def tym_check(f_list,fa_list,f2_list): 
    for i in range(len(f_list)): 
     if f_list[i] > fa_list[i]: 
      fa_list[i] = f_list[i] 
     else: 
      print f_list, fa_list, f2_list 
      f2_list[i] = fa_list[i] 
      f_list[i] = f_list[i] + f2_list[i] 
    print f_list, fa_list,f2_list 
    print 'yo' 
    return f2_list 


if __name__ == '__main__': 
    f = {} 
    fa = {} 
    f2 = [0,0,0,0] 
    add = '0013a2' 
    data = [1.0, 0.0, 0.342, 0.3] 
    f, fa, f2 = tym_save(add, data, f, fa,f2) 
    data = [2.0, 1.0, 0.342, 0.3] 
    f[str(add)] = data  
    ## Here the fa is also updating. 
    f, fa, f2 = tym_save(add, data, f, fa,f2) 
    add = '0013a2' 
    data = [0.0, 0.0, 0.0, 0.0] 
    f, fa, f2 = tym_save(add, data, f, fa,f2) 
+0

「fa = f」とは何でしょうか?実際に 'f 'と呼ばれる辞書への2番目の参照を作成しています。 –

+0

@ TadhgMcDonald-Jensen実際には、' f'は次に値が異なる 'f'を走査するために使われます。 'fa = f'という代入は' f ['0013a200'] 'にデータがないときの状態です。 – abhi1610

+0

はい、同じオブジェクトへのポインタとして割り当てているため、両方を更新しているようです。 –

答えて

3

あなたのtym_save()機能で条件付き割り当てfa = fを持っています。これはあなたが記述した望ましくない動作を引き起こしています.fを更新するたびにfa(同じ場所を指し示しています)を更新しているためです。代わりに、fをコピーしたいとします。

import copy 
fa = copy.deepcopy(f) 
+0

'tym_save()'関数は、辞書が 'f'から' fa'まで作成されたときに初めて保存するために必要です。なぜなら、次の 'f'で値をチェックインするために' fa'オブジェクトを使い、数学をしたいからです。 – abhi1610

+0

私はあなたがそれを必要としないと言っているわけではありません、私は 'fa = f'があなたの望ましくない行動を作り出していると言っています。私の答えにその行を代入してみると、期待される結果が得られるはずです。 – mwm314

+0

ありがとうございます。それは魅力のように働いています。しかし私は自分のコードでいくつかの助けを求めるだろう。 'tym_check()'は 'f'を' fa'でチェックすることで、条件に対応する1対1の値を追加します。もしそれよりも小さければ、 'f'の値を加えて、そのまま渡すべきではありません。 – abhi1610