2012-06-26 3 views
3

다음 코드는 발생하여 설명을 찾는 문제입니다. 예상했던 것과 다른 코드의 동작. 아래 코드는 내 예상 출력과 실제 출력입니다. 마지막으로 주목해야 할 점은이 코드가 '이상한'코드 일 수 있으며 범위 (1)를 사용하는 것이 가장 이상하다고 말하는 것이 다소 이상하다는 것입니다. 그 이유는 프로그램에서이 정확한 발생 (범위는 변수이지만이 값에서 발생)으로 인해 문제가 발생했기 때문입니다. 그래서이 간단한 코드를 만들어 복제했습니다.목록 및 추가로 파이썬 이상한 동작이 발생했습니다.

userList = [] 

class User(): 
    listA = [] 
    listB = [] 

    def setup(self): 
     for i in range(1): 
      self.listA.append('a') 
      self.listB.append('b') 

for i in range(5): 
    user = User() 
    userList.append(user) 

for i in range(len(userList)): 
    userList[i].setup() 

for i in range(len(userList)): 
    print str(userList[i].listA) 
    print str(userList[i].listB) 

예상 출력

['a'] 
['b'] 
['a'] 
['b'] 
['a'] 
['b'] 
['a'] 
['b'] 
['a'] 
['b'] 

실제 출력

['a','a','a','a','a'] 
['b','b','b','b','b'] 
['a','a','a','a','a'] 
['b','b','b','b','b'] 
['a','a','a','a','a'] 
['b','b','b','b','b'] 
['a','a','a','a','a'] 
['b','b','b','b','b'] 
['a','a','a','a','a'] 
['b','b','b','b','b'] 

토론

I의 apprecia 왜 이런 일이 벌어지는 지에 대한 설명. 내장 append() 함수가 어떻게 든 모든 사용자에게 영향을 주는지 또는 각 사용자가 어떻게 든 자신의 필드를 공유하는지는 확실하지 않습니다. Python 2.7.3에서 실행.

+2

'listA'는 들여 쓰기 내부에도 불구하고 클래스하지 인스턴스 변수 – Voo

+0

입니다 User() 클래스 용? – user650658

+1

그렇습니다. 클래스 변수의 레벨에 들여 쓰기 되긴하지만 클래스 변수입니다. –

답변

8

는 클래스 수준에서 어떤 변수를 "선언"할 필요는 없습니다 것을 코드에

class User(): 
    def setup(self): 
     self.listA = []       # instance variable 
     self.listB = []       # instance variable 
     for i in range(1): 
      self.listA.append('a') 
      self.listB.append('b') 

참고이 비교

+0

사실,하지만 어떻게하는지 알아 내려고했습니다. 도와 줘서 고마워! 또 다른 StackOverflow 질문은 클래스 레벨 변수를 선언하기 위해 클래스에 대한 __init__ 메소드에 대해 논의하는 데 도움이되었습니다. – user650658

관련 문제