0

在阅读了“METHINKS IT IS LIKE A WEASEL”算法后,我一时兴起写了以下内容。我期望在 pop_gen() 中发生的是创建十个 Gib 实例——每个都有一个随机名称——并存储在列表 popul 中。相反,我得到的是具有相同名称的实例列表。我认为我实际上只创建了一个实例然后引用它十次,但我不知道为什么 - 我尝试使用 for 循环而不是列表理解来执行它,并将随机名称作为变量传递Gib 类本身的随机化。

import random
import string

class Evolver:
    def __init__(self, input_text, chance):
        self.input_text = list(input_text)
        self.gib_text = [random.choice(chars) for c in self.input_text]
        self.chance = chance
        self.popul = []

    def pop_gen(self):
        temp_popul = [Gib(self.gib_text, self.chance) for i in range(10)]
        self.popul = temp_popul

class Gib:
    def __init__(self, gib_text, chance):
        self.name = self.mutator(gib_text, chance)
        self.score = 0

    def mutator(self, gib_text, chance):
        for c in range(len(gib_text)):
            if chance >= random.randint(1, 100):
                gib_text[c] = random.choice(chars)
        return gib_text

chars = string.uppercase

e = Evolver("TEST", 100)
e.pop_gen()

for p in e.popul:
    print p, p.name

任何和所有的帮助表示赞赏!

4

1 回答 1

0

您正在创建 10 个具有相同名称的单独实例。由于Gib.name最终成为一个列表,因此当您在 中对其进行变异时Gib.mutator,对该列表的所有引用都会看到更改。当您首先创建Gibs 时,您将相同的列表 ( self.gib_text) 传递给它们,因此它们都为 a 共享相同的列表name,因此它们最终都具有相同的名称(即使它在 中发生了变异Gib.mutator)。self.gib_text一种解决方法是在将其传递给初始化程序时进行复制:

def pop_gen(self):
    temp_popul = [Gib(self.gib_text[:], self.chance) for i in range(10)]
于 2013-05-20T12:50:08.050 回答