2017-06-09 29 views
4

我正在一类多项式的物体,由词典表示:为什么我的实例正在改变?

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 =字典(old_dict)将复制给你,你要一个副本不能引用 – Rosh

回答

0

这不是副本,只是原来的参考字典:

neg_pol = self.coeffs_dict 

你要一个副本,所以你可以变异它不会对原有搞乱:

neg_pol = self.coeffs_dict.copy() 

您可能想要检查“How can I assign by value in python”以获取有关如何复制其他可变对象的线索 - 关于如何复制builtins,Python不是非常一致,例如list类型没有copy方法,大多数人使用切片符号来复制列表:

new_list = old_list[:] 

由于MSeifert建议,字典内涵是产生突变副本的好方法:

>>> 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) 

这表明这两个变量名称引用的是同一个对象。

1

正如有人指出的:

neg_pol = self.coeffs_dict 

不创建一个新的字典,neg_pol将只是为相同的字典和另一个参考任何改变(如neg_pol[key] = -self.coeffs_dict[key])将是可见光变量。

个人而言,我更喜欢字典-内涵,创造新类型的字典,而不是仅仅使用copy

class Sparse_polynomial(): 

    # ... your other stuff 

    def __neg__(self): 
     return Sparse_polynomial({key: -value for key, value in self.coeffs_dict.items()}) 
相关问题