2016-04-13 17 views
2

çağrılırken bir Python nesne arama sırasında ben bir sınıf aşağıda görebileceğiniz gibi, bazı parametreler vardır ve nitelikleri Parçacık var aştı. Ancak, fonksiyon için pozisyon belirleyiciye geldiğinde ve copy() fonksiyonunu çalıştırdığında, hata mesajını alırım: RuntimeError: Python nesnesini çağırırken maksimum yineleme derinliği aşıldı. deepcopy() veya import sys sys.setrecursionlimit (10000) gibi farklı seçenekler denedim, ancak bunların hiçbiri işe yaramadı ... Herhangi bir fikri olan var mı? Eğer mülkiyet ve onu destekleyen sıradan öznitelik hem adı olarak position kullanmaya çalışıyorsanız gibiPython: Maksimum yineleme derinliği kopyalama işlemini

def initCost(n): 
    a = random.randint(0,10)    #gram. 
    b = random.randint(0,5)    #price 
    return [random.randint(0,a*b) for i in range(n)] 

costs = initCost(10) 

class Particle: 
    def __init__(self, n, maxWeight): 
     self.position = [random.randint(0,1) for i in range(n)] #position 
     self.velocity = [0 for i in range(n)]     #velocity 
     #self.fit = self.fitness(self.position) 
     self.bp = self.position.copy()       #best position 
     self.bf = self.fit         #best fitness 
     self.evaluate() 

    def fit(self, x): 
     fitt = 0 
     for i in range(len(x)-1): 
      if (x[i] == 1): 
       fitt = fitt + costs[i] 
     return fitt 

    def evaluate(self): 
     """ evaluates the particle """ 
     self.fitness = self.fit(self.position) 

    @property 
    def position(self): 
     return self.position 

    @property 
    def bp(self): 
     return self.bp 

    @property 
    def bf(self): 
     return self.bf 

    @position.setter 
    def position(self, newPosition): 
     self.position = newPosition.copy() 
     #self.position = newPosition[:] 
     self.evaluate() 
     # automatic update of particle's memory 
     if (self.fit<self.bf): 
      self.bp = self.position 
      self.bf = self.fit 
+0

Python'un getters ve setter sürümüyle% 100 aşina değilim, ancak programınızdakilerin hiçbir zaman çağrılmadığını söyleyebilirim çünkü bu sınıfın bir nesnesini başlattığınızda yaptığınız ilk şey; 'self.position' bir' listeye 'başvurusu. – TigerhawkT3

+0

@ TigerhawkT3: Hayır, çağrıldılar, tekrar aradılar ve tekrar ... – user2357112

+0

@ user2357112: Lütfen bana yaptığım hatayı söyleyemez misiniz? – Nelly

cevap

3

görünüyor: Bu benim kodudur. Örneğin,

@position.setter 
def position(self, newPosition): 
    self.position = newPosition.copy() 
# ^^^^^^^^^^^^^^^ 

Eğer tanımlarken ayarlayıcı kullanacak self.position ayarlamak için bu girişimi! Benzer şekilde, bu alıcı sadece kendisini çağırır!

self.position'un position özellik tanımının içinde kullanılmaya çalışılması, özelliği atlamayacaktır. Özelliği destekleyen "normal" bir özellik istiyorsanız, self._position veya başka bir şey gibi başka bir şey arayın.

İlgili konular