我有一个粒子类,它有一些参数和属性,正如你可以在下面看到的。但是,当它到达函数setter的位置,并执行copy()函数时,我得到错误消息:RuntimeError:调用Python对象时超过了最大递归深度。我尝试过不同的选项,如深度复制()或导入sys sys. setpostsionlimited(10000),但都不起作用…有人知道吗?这是我的代码:
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
看起来您正在尝试使用位置
作为属性和支持它的普通属性的名称。例如,
@position.setter
def position(self, newPosition):
self.position = newPosition.copy()
# ^^^^^^^^^^^^^^^
这种设置self.位置
的尝试将使用您正在定义的setter!类似地,
@property
def position(self):
return self.position
这个吸气剂只是自称!
尝试在位置
属性定义中使用self.位置
不会绕过该属性。如果您想要一个支持该属性的“常规”属性,请将其命名为其他名称,例如self._position
或其他名称。