在阅读了“METHINKS就像一个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
任何和所有帮助表示赞赏!
答案 0 :(得分:0)
您正在创建10个具有相同名称的单独实例 。由于Gib.name
最终成为列表,因此当您在Gib.mutator
中对其进行变更时,对该列表的所有引用都会看到更改。当您首先创建Gib
时,您会将相同的列表(self.gib_text
)传递给它们,因此它们共享name
的相同列表,因此它们最终都会相同的名称(即使它在Gib.mutator
中变异)。一种解决方法是在将self.gib_text
传递给初始化程序时复制def pop_gen(self):
temp_popul = [Gib(self.gib_text[:], self.chance) for i in range(10)]
:
{{1}}