Python
请解释为什么这两种代码的工作方式不同。。 事实上,我正在尝试制造一种人工智能,在最初的几代人中,个体将朝着随机的方向发展。为了保持代码简单,我在大脑中提供了一些随机的方向
有一个个体类给个体一个大脑。它还有一个函数,返回一个与父母大脑完全相同的孩子(意味着要进入的方向相同)
我有两个密码:
首先:当父级中的某些方向发生更改时,子级中也会发生相同的更改(或者如果子级中发生更改,则父级中也会发生更改),这是我不希望发生的
第二:这个不完全是我的(这就是为什么我真的不知道它为什么工作),但它工作得很好。在父级中改变的某些方向在子级中不改变,反之亦然
请有人给我解释一下区别,为什么第一个不起作用。我非常感谢你的回答。
第一个:
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 child
parent = 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 clone
class Individual():
def __init__(self):
self.brain = Brain()
def getChild(self):
child = Individual()
child.brain = self.brain.clone()
return child
parent = 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()
实例在第一种情况下,您指的是同一个对象。 尝试在第一种情况下添加以下print语句
在第一种情况下,对Brain()有新的参考。你可以看到它是如何处理的
相关问题 更多 >
编程相关推荐