2013-05-23 2 views
2

У меня есть этот простой класс:Проходят список класса питона

class revs: 
    def __init__(self, rev, us, accs = []): 
     self.rev = rev 
     self.us = us 
     self.accs = accs 

И я этот кусок кода Asign значения в список и находится внутри петли

rev, usu = cada_l.split("|") 
acct = each_l[:2].strip() 
list_acct.append(acct) 

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

drevs = {} 
cada = revs(rev, us, list_acct) 
drevs[cada.rev] = cada 

и это правильно работает с нами и оборот, но с list_acct когда-либо Обновит ИНГ всех экземпляров:

drevs['1'].rev 
'1' 
drevs['2'].rev 
'2' 
drevs['1'].us 
'user1' 
drevs['2'].us 
'user2' 
drevs['1'].accs 
'["Doc1","Doc2"]' 
drevs['2'].accs 
'["Doc1","Doc2"]' 

И если я изменить list_acct.clear(), значения во всех случаях ясно, что я все еще достаточно новый для Python, и это меня смущает.

Благодаря

+1

По умолчанию '' accs' к None' и проверять его в '__init__' – voithos

ответ

4

Это похоже, что это происходит потому, что вы передаете тот же список для каждого объекта. В результате все объекты сохраняют ссылки на один и тот же список, и поскольку list изменен, он, как представляется, сразу меняет «все».

Чтобы это исправить, либо передать в нового пустого списка каждый раз, когда вы создаете revs объект, либо клонировать список вы проходящий в:

cada = revs(rev, us, list_acct[:]) 

Обрати внимание, что если list_acct содержит изменяемый объектов, вы все равно можете снова попасть в ту же проблему, но на один уровень глубже!

Если вы не передаете списки объектам revs при их создании (я не могу сказать, так как вы не показываете свой полный код!), То у вас есть та же проблема, но для другая причина: в Python аргументы по умолчанию оцениваются один раз, во время определения функции. Таким образом, вы можете получить такое поведение:

r1 = revs(1, 1) 
r2 = revs(2, 2) 
r1.accs.append("Hi!") 
print(r1.accs) # prints ['Hi!'] 
print(r2.accs) # prints ['Hi!'] 

Поскольку аргумент по умолчанию для revs конструктора всегда указывает на тот же список. См. this question для объяснения причин, но чтобы обойти его, просто используйте None как ваш по умолчанию вместо [].

class revs: 
    def __init__(self, rev, us, accs=None): 
     self.rev = rev 
     self.us = us 
     if accs is None: 
      accs = [] 
     self.accs = accs 
+0

Спасибо, это именно то, что мне нужно –

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