2012-04-19 3 views
0

Im 다항식에 대한 클래스를 수행하고 있는데 복사 함수에 문제가 있습니다. Poly 객체의 복사본을 생성하고 새로운 Poly 객체에 대한 참조를 반환한다고 가정합니다. 나는이 사본 아이디어에 정말로 머물렀다.파이썬에서 클래스 정의의 복사 함수

class Poly: 

    def __init__ (self, p): 
     self.a = p 
     self.deg= len(p) -1 
     if len(p) == 1 and p[0] == 0: 
      self.deg = -1 

    def evalPoly(self,x0): 
     ''' evaluates the polynomial at value x''' 
     b=0 
     for coefficients in reversed(self.a): 
      b=b*x0+int(coefficients) 
     return b 

    def polyPrime(self): 
     '''replaces the coeffiecients of self with the coefficients   
     of the derivative polynomial ''' 
     if self.deg == 0: 
      return np.zeroes(1,float), 0 
     else: 
      newdeg=self.deg-1 
      p=[i*self.a[i] for i in range(1,self.deg+1)] 
      p=str(p)[1: -1] 
      p=eval(p) 
     return p 

    def copy(self): 
     return Poly(self.a) 

내가 새로운 폴리에 대한 참조를 폴리 객체의 복사본을 만들고 반환하는 방법에 붙어있어 어떤 도움을 주셔서 감사 문제는 실제로 __init__()에 숨어

+2

정확히 무슨 문제가 있습니까? – sinelaw

답변

4

나는 당신이 겪고있는 문제는 생각 self.a 다음 새 폴리 개체의 인스턴스에 그 목록에 대한 참조를 전달하는 목록 때문이다.

당신은 목록을 복사하고 개체를 인스턴스화하는 그 사본을 제공해야합니다 : 파이썬에서

import copy 

class Poly: 
    ... 
    def copy(self): 
     return Poly(copy.copy(self.a)) 
2

객체.

self.a = p[:] 
2

할당 문은 개체를 복사하지 않습니다, 그들은 대상과 대상 사이의 바인딩을 작성합니다. 변경 가능하거나 변경 가능한 항목을 포함하는 콜렉션의 경우, 사본을 변경하지 않고 사본 하나를 변경할 수 있도록 사본이 필요한 경우가 있습니다.

체크 아웃 복사 모듈 : 작동하지 않는 이유

http://docs.python.org/library/copy.html

1

당신이 정교시겠습니까? 이것은 나를 위해 완벽하게 작동합니다 :

class Poly(object): 

    def __init__ (self, p): 
     self.a = p 
     self.deg= len(p) -1 
     if len(p) == 1 and p[0] == 0: 
      self.deg = -1 

    def evalPoly(self,x0): 
     ''' evaluates the polynomial at value x''' 
     b=0 
     for coefficients in reversed(self.a): 
      b=b*x0+int(coefficients) 
     return b 

    def polyPrime(self): 
     '''replaces the coeffiecients of self with the coefficients   
     of the derivative polynomial ''' 
     if self.deg == 0: 
      return np.zeroes(1,float), 0 
     else: 
      newdeg=self.deg-1 
      p=[i*self.a[i] for i in range(1,self.deg+1)] 
      p=str(p)[1: -1] 
      p=eval(p) 
     return p 

    def __str__(self): 
     return "%s %s" % (self.a, self.deg) 

    def copy(self): 
     return Poly(self.a) 

if __name__ == "__main__": 
    p = Poly((1,3)) 
    print p 
    x = p.copy() 
    print x  

편집 : 좋아요. 이제 알았습니다. 그는 변경 가능한 목록을 전달하는 것이 일반적인 합의라고 생각합니다.

관련 문제