Python:调用复制函数时调用 Python 对象时超出了最大递归深度
问题描述
我有一个类Particle,它有一些参数和属性,如下所示.但是,当它确实到达函数设置器的位置并执行 copy() 函数时,我收到错误消息:RuntimeError:调用 Python 对象时超出最大递归深度.我尝试了不同的选项,例如 deepcopy() 或 import sys sys.setrecursionlimit(10000) ,但都没有奏效……有人知道吗?这是我的代码:
I have a class Particle which has some parameters and attributes, as you can see below. But, when it does get to the function setter for position, and it executes the copy() function, I get the error message : RuntimeError: maximum recursion depth exceeded while calling a Python object. I've tried different options, like deepcopy(), or import sys sys.setrecursionlimit(10000) , but none of them worked... Does anyone have any idea? This is my code:
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
作为属性名称和支持它的普通属性的名称.例如,
It looks like you're trying to use position
as the name of both the property and the ordinary attribute backing it. For example,
@position.setter
def position(self, newPosition):
self.position = newPosition.copy()
# ^^^^^^^^^^^^^^^
设置 self.position
的尝试将使用您定义的设置器!同样,
This attempt to set self.position
will use the setter you're defining! Similarly,
@property
def position(self):
return self.position
这个 getter 只是调用自己!
This getter just calls itself!
尝试在 position
属性定义中使用 self.position
不会绕过该属性.如果您想要一个支持属性的常规"属性,请将其命名为其他名称,例如 self._position
或其他名称.
Trying to use self.position
inside the position
property definition won't bypass the property. If you want a "regular" attribute backing the property, call it something else, like self._position
or something.
相关文章