这两个代码应该做同样的事情,但第一个代码没有按我预期的那样工作

Python

请解释为什么这两个代码的工作方式不同。实际上,我正在尝试制作一种AI,在初始几代中,个体将朝随机方向移动。为了保持代码简单,我在中自己提供了一些随机方向

有一个Individual类,它为个体提供大脑。它还有一个函数,返回一个与父代拥有完全相同大脑(意味着相同的移动方向)的子代。

我有两个代码:

第一个: 当父代的某些方向发生变化时,子代的相同部分也会发生变化(或者如果子代的变化,它也会在父代中发生变化),这是我不希望发生的。

第二个: 这个代码不是完全由我编写的(这就是为什么我不太清楚它为什么能工作),但它运行得很好。父代的某些方向发生变化时,子代不会发生变化,反之亦然。

请有人解释一下它们的区别以及为什么第一个代码不起作用。我非常感谢你的回答。

第一个代码:

class Brain():    def __init__(self):        self.directions = [[1, 2], [5, 3], [7, 4], [1, 5]]class Individual():    def __init__(self):        self.brain = Brain()    def getChild(self):        child = Individual()        child.brain = self.brain        return childparent = Individual()child = parent.getChild()parent.brain.directions[0] = [5, 2]print(parent.brain.directions)print(child.brain.directions)

[ [5, 2], [5, 3], [7, 4], [1, 5] ]

[ [5, 2], [5, 3], [7, 4], [1, 5] ]

第二个代码:

class Brain():    def __init__(self):        self.directions = [[1, 2], [5, 3], [7, 4], [1, 5]]    def clone(self):        clone = Brain()        for i, j in enumerate(self.directions):            clone.directions[i] = j        return cloneclass Individual():    def __init__(self):        self.brain = Brain()    def getChild(self):        child = Individual()        child.brain = self.brain.clone()        return childparent = Individual()child = parent.getChild()parent.brain.directions[0] = [5, 2]print(parent.brain.directions)print(child.brain.directions)

[ [5, 2], [5, 3], [7, 4], [1, 5] ]

[ [1, 2], [5, 3], [7, 4], [1, 5] ]


回答:

在第一个代码中,设置child.brain = self.brain并没有达到你预期的效果。这是一个浅拷贝,意味着它只是创建了一个指向同一个Brain()实例的新指针。因此,现在child.brainself.brain都指向内存中的同一个Brain()

在第二个代码中,你在进行深拷贝。因此,你实际上是在内存中分配了另一个Brain()。现在child.brainparent.brain指向它们各自独立的Brain()实例在内存中。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注