2013-10-02 3 views
0

Я создал список, содержащий экземпляры класса, каждый из которых имеет пустой список в качестве атрибута. Я пытался добавить один из этих списков на каждой итерации моего скрипта, и вместо этого все они были добавлены. Код выглядит следующим образом:Python: добавление атрибута экземпляра для экземпляров в списке

class generation: 
    def __init__ (self, number, container=[]): 
     """This is the class containing lists""" 
     self.n=number 
     self.cont=container 

class hybrid_variant: 
    def __init__ (self, generation): 
     """Instances of this class go into lists in instances of generation""" 
     self.gen=generation 

generation_list=[] 
for x in range(3): 
    hybrid=hybrid_variant(generation= x+1) 
    new_generation=True 
    for elem in generation_list: 
     if elem.n == hybrid.gen: 
      new_generation=False 
    if new_generation==True: 
     generation_list.append(generation(hybrid.gen)) 
    for elem in generation_list: 
     if elem.n == hybrid.gen: 
      elem.cont.append(hybrid) 

Вместо того, чтобы один элемент в каждом атрибуте контейнера всех поколений каждое поколение имеет все три элемента.

+0

код форматирование сломано; Кроме того, было бы неплохо прочитать http://www.python.org/dev/peps/pep-0008/ –

ответ

1

Как описано в this question изменяемые параметры по умолчанию сохраняются по ссылке, поэтому, если все экземпляры вашего типа generation будут ссылаться на один и тот же объект списка. Таким образом, изменение одного изменит его для каждого другого экземпляра.

Чтобы исправить это, просто не использовать пустой список в качестве аргумента по умолчанию, но построить пустой список в методе вместо:

class generation: 
    def __init__ (self, number, container=None): 
     self.n = number 
     self.cont = [] if container is None else container 
Смежные вопросы