2017-06-09 5 views
4

Iは、辞書によって表される多項式オブジェクトのクラス、作っている:インスタンスが変わるのはなぜですか?

3 * X^2 + X + 2 == {2:3,1:1,0:2}

class Sparse_polynomial(): 
    def __init__(self, coeffs_dict): 
     self.coeffs_dict = coeffs_dict 


    def __repr__(self): 
     terms = [" + ("+str(self.coeffs_dict[k])+"*x^" + str(k)+")" \ 
       for k in sorted(self.coeffs_dict.keys(), reverse=True)] 
     terms = "".join(terms) 
     return terms[3:] 

    def __neg__(self): 
     neg_pol= self.coeffs_dict 
     for key in self.coeffs_dict: 
      neg_pol[key]= -self.coeffs_dict[key] 
     return Sparse_polynomial(neg_pol) 

私は__neg__メソッドを使用しようとするたびに、元のオブジェクトの変更:

これは質問に関連するのです私のコードの一部です。例:

>>> p1= Sparse_polynomial({1:3,5:1}) 
>>> p1 
(1*x^5) + (3*x^1) 
>>> -p1 
(-1*x^5) + (-3*x^1) 
>>> p1 
(-1*x^5) + (-3*x^1) 
>>> 

私は本当に元の理由を理解できませんp1。私はそれに直接的な変更を加えず、フィールドにアクセスしました。

私はこれを解決できるように誰でも明記できますか?

+0

new_dict = dictの(old_dict)あなたはコピーを – Rosh

答えて

0

これはコピーではない、オリジナルの辞書への参照のみ:

neg_pol = self.coeffs_dict 

あなたは、元のいじりせずに、それを変異させることができるようにあなたは、コピーをしたい:

neg_pol = self.coeffs_dict.copy() 

あなたは可能他の変更可能なオブジェクトをコピーする方法の手がかりを得るために "How can I assign by value in python"をチェックしたい - 例えば、listタイプはcopyメソッドを持たず、リストをコピーするためにスライス表記を使用するなど、Pythonは組み込みコードをコピーする方法に一貫性がありません。

new_list = old_list[:] 

MSeifertが示唆したように、dictの内包表記は、突然変異したコピーを生成するための良い方法です:

>>> original_dict = {'a': 2, 'b': 3} 
>>> square_dict = {k + "²": v * 2 for k, v in original_dict.items()} 
>>> double_dict 
{'a²': 4, 'b²': 9} 
>>> original_dict 
{'a': 1, 'b': 2} 
+0

良い質問が半分を参照していたい、あなたのためにそれをコピーします。答え、とても歓迎です! –

2

私はそれは、フィールドのアクセス、それには直接変更を加えていません。真実ではない

:あなたのコードを見て...

def __neg__(self): 
    neg_pol= self.coeffs_dict 
    for key in self.coeffs_dict: 
     neg_pol[key]= -self.coeffs_dict[key] 

あなたは、係数辞書への参照をつかんで、すべてのメンバーを否定。これはではなく、です。それはオリジナルへの参照です。

別の辞書を返す場合は、利用可能ないくつかのコピー方法のいずれかを使用してください。人気の一つはクラス自体からcopy次のとおりです。

neg_pol = self.coeffs_dict.copy() 

idメソッドを使用し、アイテムの「ハンドル」を確認するには。たとえば:

print id(self.coeffs_dict), id(neg_pol) 

これは、2つの変数名が同じオブジェクトを参照していることを簡単に示しています。

1

その他は指摘したように:

neg_pol = self.coeffs_dict 

新しい辞書を作成しない、neg_pol同じ辞書ためだけに別の基準になり、(neg_pol[key] = -self.coeffs_dict[key]等)の変更が両方に表示されます変数。

個人的に私だけではなく、copyを使用しての新しいdictsを作成するのdict-内包表記を好む:

class Sparse_polynomial(): 

    # ... your other stuff 

    def __neg__(self): 
     return Sparse_polynomial({key: -value for key, value in self.coeffs_dict.items()}) 
関連する問題