2014-09-30 1 views
2

웹상 어디서나 답변을 찾을 수없는 매우 구체적인 문제가 있습니다. 저는 Python 코드에 익숙하지 않습니다 (C++은 제 1 언어 임). 그래서 이것은 의미 론적 문제 일뿐입니다. 내 질문에 대한 루프의 범위 내에서 선언 된 개체에 관한 것입니다.Python - for 루프 내에서 선언 된 객체 목록에 추가하기

이 코드의 목적은 for 루프 내에 새로운 임시 객체를 만들고, 그 객체의 목록에 항목을 추가 한 다음 객체를 for 루프 외부의 목록에 넣는 것입니다. for 루프를 반복 할 때마다 항목을 채우기 위해 새롭고 별도의 객체를 만들고 싶습니다. 그러나 for 루프가 실행될 때마다 객체의 목록은 이미 이전 반복의 항목으로 채워집니다.

저도 같은 문제가있는 더 큰 프로그램이 대신 대규모 프로그램을 포함, 나는 같은 의미 론적 문제가있는 작은 예를 썼다 : 프로그램이 끝날 무렵

#Test 

class Example: 
    items = [] 

objList = [] 

for x in xrange(5): 
    Object = Example() 

    Object.items.append("Foo") 
    Object.items.append("Bar") 
    print Object.items 

    objList.append(Object) 

print "Final lists: " 
for x in objList: 
    print x.items 

을 이것은 각각의 반복 재현되지 않는다 (이 경우 객체라고도 함) 예를 믿고 날 리드, 대신 각 반복에 걸쳐 유지

["Foo","Bar","Foo","Bar","Foo","Bar","Foo","Bar","Foo","Bar"]` 

, objList의 모든 항목 (첫 번째 반복에서조차 것들)를 포함, 에 액세스 할 때마다 루프가 계속됩니다.

내 간단한 질문; 파이썬에서 이것을 어떻게 바꿀 수 있습니까?

답변

3
가 클래스 정의를 변경

:

class Example: 
    def __init__(self): 
     self.items = [] 

문제는 items 각 개체의 인스턴스에 바인딩되지 않는 즉, 클래스 정의의 일부입니다. items은 클래스 변수이므로 예제의 인스턴스간에 공유됩니다.

+0

내 문제가 해결되었습니다. 감사합니다. 나는 클래스의 다양한 변수가 존재한다는 것을 알지 못했다. – Peabody

2

클래스 Exampleclass variableExample.items을 사용하여 문자열을 저장합니다. 클래스 변수는 객체의 모든 인스턴스에서 공유되므로 모든 객체를 함께 가져와 실제로 객체가 같다고 생각하면 이 아닙니다.

당신은 items 변수를 작성하고 __init__ 기능

class Example(object): 

    def __init__(self): 
     self.items = [] 

Example의 각 인스턴스가 함께 작동하도록 자신의 items 목록이 있는지 확인합니다에 self에 할당해야합니다.

또한 Python 2.x를 사용할 때 실제로 하위 클래스 object을 사용해야합니다.

+0

다른 사람과 마찬가지로이 문제가 해결되었습니다. 이제는 객체 공유 변수에 대해 알고 있습니다. – Peabody