Python: 在调用copy函数时,出现了超过最大递归深度的错误。

3

我有一个类 Particle,它有一些参数和属性,如下所示。但是,当它到达位置的函数setter时,并且执行copy()函数时,出现错误信息:RuntimeError: maximum recursion depth exceeded while calling a Python object。我尝试了不同的选项,比如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

我对Python版本的getter和setter不是100%熟悉,但我可以告诉你,在你的程序中,这些函数从未被调用,因为当你实例化这个类的对象时,第一件事就是将self.position引用绑定到一个list - TigerhawkT3
@TigerhawkT3:不,它们被调用了,又被调用了,再次被调用了... - user2357112
@user2357112:你能告诉我我犯了什么错误吗? - Nelly
@user2357112 - 使用具有setter的属性是否有什么特殊之处,可以防止它们被相同引用所掩盖? - TigerhawkT3
@TigerhawkT3: "完全相同的引用" 经过 setter。 - user2357112
1个回答

4

看起来你试图同时将position作为属性和支持它的普通属性的名称。例如,

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

这个尝试设置self.position将会使用你正在定义的setter!同样地,
@property
def position(self):
    return self.position

这个getter方法只是在调用自身!

试图在position属性定义中使用self.position将无法绕过属性。如果您想要一个“常规”的属性来支持该属性,请将其命名为其他名称,例如self._position或其他名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接