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) 

및 마지막으로, 나는이 같은 회전 속도를 올린다 목록을 관리하는 딕셔너리를 만듭니다

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

을 그리고 레브 우리와 함께 제대로 작동하지만 list_acct으로 이제까지 UPDAT한다 모든 인스턴스를 보내고 :

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를 변경하는 경우, 모든 인스턴스의 값이 분명하다, 난 아직 파이썬 비교적 새로운 해요이 나를 혼란.

감사

당신은 모든 개체에 동일한 목록을 통과하고 있기 때문에 일어나는 것처럼이 보이는
+1

기본 'accs'를'없음 '으로 지정하고'__init__ '에서 확인하십시오. – voithos

답변

4

. 결과적으로 모든 개체는 동일한 목록에 대한 참조를 유지하며 list은 변경할 수 있기 때문에 즉시 "모두"로 변경됩니다. 즉, list_acct가 변경할 수 포함되어있는 경우

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

참고 :

당신이 전달하고있는 목록을 revs 개체를 만들거나 다른 복제이 문제를 해결, 중 하나 새로운 빈 목록의 각 시간을 통과하려면 객체를 사용하면 같은 문제가 다시 발생할 수 있지만 한 단계 더 깊어집니다!

전혀 만들지 않을 때 revs 개체에 목록을 전달하지 않으면 (전체 코드가 표시되지 않아서 알 수 없음) 동일한 문제가 발생하지만 다른 이유 : 파이썬에서, 기본 인수는 모두 함수 정의시에 한 번 평가됩니다. revs 생성자의 기본 인수는 항상 동일한리스트를 가리키는 때문에

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

: 따라서,이 동작을 얻을 수 있습니다. 이유에 대한 설명은 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

감사합니다. 이것이 내가 필요한 것입니다. –