【发布时间】:2026-02-16 14:20:02
【问题描述】:
我有一个 Particle 类,它有一些参数和属性,如下所示。但是,当它到达函数设置器的位置并执行 copy() 函数时,我收到错误消息:RuntimeError:调用 Python 对象时超出最大递归深度。我尝试了不同的选项,例如 deepcopy() 或 import sys sys.setrecursionlimit(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
【问题讨论】:
-
我不是 100% 熟悉 Python 的 getter 和 setter 版本,但我可以告诉你,你的程序中的那些永远不会被调用,因为当你实例化一个对象时你做的第一件事类是将
self.position引用绑定到list。 -
@TigerhawkT3:不,他们被召唤,又被召唤,又被召唤……
-
@user2357112: 你能告诉我我犯的错误吗?
-
@user2357112 - 使用带有 setter 的属性是否可以防止它们被相同的引用掩盖?
-
@TigerhawkT3:“相同的引用”通过设置器。