通过修改现有对象创建新对象

Create a new object by modifying an existing object

我创建了以下 class:

class ball:
    def __init__(self,d=0,weight=0):
        self.d = d
        self.weight = weight

然后我们有一个全局函数,returns一个修改重量的球,定义如下:

def modifyWeight(ball, weight):
    ball.weight = weight
    return ball

最后是主函数,它根据权重列表创建球列表:

def createBallList(ball, weights):
    ballList = []
    for weight in weights:
        modifyWeight(ball,weight)
        ballList.append(ball)

    return ballList

好吧,这就是解释,如果 weights = [20,25,15] 我预计:

ball = ball(2)
ballList = creatBallList(ball,weights)

ballList[0].weight = 20
ballList[1].weight = 25
ballList[2].weight = 15

但结果是:

ballList[0].weight = 15
ballList[1].weight = 15
ballList[2].weight = 15

一直在尝试一些事情,但显然没有任何效果。谢谢!

您需要复制该对象,您只是重复将同一对象添加到列表中,因此当您设置权重时,您是为同一对象设置权重,使用 copy.deepcopy 实际创建一个新对象。

from copy import deepcopy 
cp_b = deepcopy(ball) # new copy of the ball object
modifyWeight(cp_b,weight)

当您执行 ball.weight = weight 时,您不会创建新球。您更改现有球的重量。当您执行 ballList.append(ball) 时,您会一遍又一遍地将同一个球添加到列表中。该列表包含相同的球三次。

如果您想在每次循环中创建一个新球,请在每次循环中创建一个新球:

def createBallList(weights):
    ballList = []
    for weight in weights:
        newBall = ball(weight=weight)
        ballList.append(newBall)

    return ballList

请注意,您不需要将 ball 传递给 createBallList。如果它所做的只是创建新球,而不是使用原始球,那么它根本不需要原始球。

我不确定 d 在你的 ball class 中的作用是什么,或者你为什么将它设置为 2,所以我省略了那部分这里。您可以 ball(d=2, weight=weight) 来创建新球,并将 d 设置为 2。