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

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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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