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.brain
和self.brain
都指向内存中的同一个Brain()
。
在第二个代码中,你在进行深拷贝。因此,你实际上是在内存中分配了另一个Brain()
。现在child.brain
和parent.brain
指向它们各自独立的Brain()
实例在内存中。