对象实例作为列表元素

时间:2013-05-20 12:45:18

标签: python oop

在阅读了“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

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

1 个答案:

答案 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}}