这两个代码应该做完全相同的事情,但第一个不工作,我的经验

2024-05-09 00:54:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: selfchildcloneinitdef方向individualclass
2条回答

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

在第二个代码中,您正在制作一个深度副本。因此,实际上是在内存中分配另一个Brain()。现在child.brainparent.brain指向内存中各自独立的Brain()实例

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

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)

相关问题 更多 >

    热门问题