0

Python

请解释为什么这两个代码的工作方式不同。实际上我正在尝试制作一种人工智能,在最初的几代人中,人们会朝着随机的方向前进。为了保持代码简单,我自己在Brain中提供了一些随机方向

有一个为个人提供大脑的个人课程。它还有一个功能,可以返回与父母具有完全相同大脑(意味着进入相同方向)的孩子。

我有两个代码:

第一:当父母的某些方向改变时,孩子也会改变同样的事情(或者如果孩子改变了,父母也会改变)这是我不希望发生的。

第二:这个不完全是我的(这就是为什么我真的不知道它为什么起作用)但它工作得很好。父母改变的某些方向在孩子身上没有改变,反之亦然。

请有人解释我的区别以及为什么第一个不起作用。我真的很感激你的回答。


第一:

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] ]

4

2 回答 2

1

在第一个代码中,设置child.brain = self.brain不符合您的预期。这是一个浅拷贝,这意味着它只是创建一个指向同一实例的新指针Brain()。所以现在child.brainself.brain两者都指向Brain()内存中的相同点。

在第二个代码中,您正在制作深拷贝。因此,您实际上是Brain()在内存中分配另一个。现在child.brainparent.brain指向他们自己Brain()在内存中的单独实例。

于 2018-09-06T10:34:50.750 回答
0

在第一种情况下,您指的是同一个对象。尝试在第一种情况下添加以下打印语句。

print (id(parent.brain))
print (id(child.brain))

在第一种情况下对 Brain() 有新的参考。你可以看到它是如何处理的。

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 = Brain()
        return child

parent = Individual()
child = parent.getChild()

parent.brain.directions[0] = [5, 2]

print(parent.brain.directions)
print(child.brain.directions)
于 2018-09-06T10:38:52.237 回答