2015-07-10 2 views
1

Я пытаюсь определить список как переменную экземпляра внутри класса, но он действует как переменная класса.Экземпляр класса Python и переменные класса

class THING: 
    def __init__(self, name, stuff): 
     self.name = name 
     self.dict = [] 
     for item in stuff: 
      self.dict.append(item) 

    def getname(self): 
     return self.name 

    def getlist(self): 
     return self.dict 

    def inc_datecnt(self,date): 
     for item in self.dict: 
      if item.has_key(date): 
       item[date] += 1 



list = [] 
dates=['July1,2015', 'July2,2015', 'July3,2015'] 
datecnts = [] 
for date in dates: 
    datecnts.append({date : 0}) 

list.append(THING('A', datecnts)) 
list.append(THING('B', datecnts)) 


for item in list: 
    print "\n", item.getname() 
    item.inc_datecnt('July1,2015') 
    for subitem in item.getlist(): 
     print subitem 

Когда я выполняю это я получаю:

A 
{'July1,2015': 1} 
{'July2,2015': 0} 
{'July3,2015': 0} 

B 
{'July1,2015': 2} 
{'July2,2015': 0} 
{'July3,2015': 0} 

Я, кажется, увеличивают словарный элемент одного класса для July1,2015, когда я хочу (и ожидать) будет увеличивая переменную экземпляра.

Помощь

+1

Вы повторно 'datecnts' построить два экземпляр' THING', и в то время как вы создали новый список в 'dict' внутри один и то же между ними. – metatoaster

+0

Возможно, вы можете напечатать тип (элемент), чтобы убедиться, что объект находится в ТО ВРЕМЯ, а не dict – ytpillai

+0

Python не имеет способа распечатать его, поэтому вам нужно будет создать 'def __str __ (self)', если вы хочу просто распечатать переменную – ytpillai

ответ

1

Когда вы передаете datecnts список конструктору ваш THING объекта, вы просто проездом ссылку (и список изменчив и ДИКТ изменчив), поэтому, если вы сделаете какие-либо изменения в Словарь для A ВЕЩИ объект, он будет отражен в B, так как B также имеет такую ​​же ссылку. Вы должны попытаться сделать copy.deepcopy из datecnts и отправить это A и B отдельно.

Пример -

import copy 
list.append(THING('A', copy.deepcopy(datecnts))) 
list.append(THING('B', copy.deepcopy(datecnts))) 
+0

ahhhhh .... Теперь я понимаю. –

+1

Пожалуйста, не забудьте принять ответ, если это вам помогло, было бы полезно для сообщества. –

+0

Принимая ответ, нажмите галочку на левой стороне. –

Смежные вопросы