2016-12-17 3 views
0
class Numbers: 
    data = [] 
    def read_from_row(self, row): 
     row_list = list(row) 
     for i in row_list: 
      self.data.append(i) 


list1 = ["15","16"] 
list2 = ["17","18"] 

instance = Numbers() 
instance.read_from_row(list1) 
print(instance.data) 

instance = Numbers() 
instance.read_from_row(list2) 
print(instance.data) 

다음은 코드 부분입니다. 따라서 처음에는 instance이 클래스 Numbers의 인스턴스이고 첫 번째 목록을 읽은 후 print(instance.data)은 자연히 ['15', '16']을 인쇄합니다. 그런 다음 동일한 변수 instance에 다시 Numbers 클래스의 새 인스턴스를 만들고 두 번째 목록에서 읽은 후에도 어떤 이유로 든 첫 번째 목록의 데이터가 여전히 포함되어 있습니다. ['15', '16', '17', '18']을 출력 중입니다.Python 클래스 인스턴스 문제

죄송합니다. 저는 파이썬에서 초보자이며 C/C++ 코딩을 오래 한 후에 왜 이런 일이 일어나는지 예상되는 동작을 이해할 수 없습니다. 파이썬 2.7을 사용하고 있습니다.

미리 감사드립니다.

답변

2

데이터는 인스턴스 구성원이 아니라 클래스 구성원입니다. 숫자 클래스의 모든 인스턴스는 동일한 데이터 목록을 "공유"합니다. 여기

참조 : Python: Difference between class and instance attributes 당신이 기대하는 일을하기 위해

:

class Numbers: 
    def __init__(self): 
     self.data = [] 
    def readFromRow(self, row): 
     self.data.extend(row) 
2

인스턴스 변수가 __init__(..)에서 생성됩니다

class Numbers(object):    # in Python 2.7 you should inherit from object 
    def __init__(self): 
     self.data = [] 

    def read_from_row(self, row): # (python naming convention) 
     self.data += row    # better way of appending to a list 
+0

파이썬의 이름 지정 규칙을 표시하는 경우 'numbers' . – pvg

+0

@pvg 내가하지 않으려 고했지만, 당신 말이 맞아요. 코드를 업데이트했습니다. – thebjorn

0

나는 당신이 단계별로 권 해드립니다 코드가 pythontutor 인 경우 클래스 블록에 Data = []을두면 모든 인스턴스간에 공유됩니다. (다른 답변은 이미 문제를 해결하는 방법을 보여줍니다. 제 목표는 문제가 발생하는 이유를 이해하는 방법을 제공하는 것입니다)