2012-02-22 5 views
3

:는 다루기 힘든 범위 내가 여기서 무슨 일이 일어나고 있는지 이해 할 수없는 것 행동

class testclass: 

    def __init__(self): 
     print "new instance" 
    myList=[] 

if __name__ == "__main__": 

    inst1=testclass() 
    inst1.myList.append("wrong") 

    inst2=testclass() 
    inst2.myList.append("behaviour") 

    print "I get the",inst2.myList 

출력은 다음과 같습니다

new instance 
new instance 
I get the ['wrong', 'behaviour'] 

나는 INST1의 목록이 아무것도 모르는 것으로 예상 것 inst2의 목록에 대해서는 어떻게 든 보입니다. myList의 범위는 클래스의 인스턴스화를 trascends합니다. 나는 이것이 매우 불안정하고 혼란 스럽거나 여기에 뭔가 빠졌는가?

감사합니다.

답변

6

정의한 방법 myList은 클래스 속성입니다.

동작 당신을위한 객체 속성 중 하나입니다 찾고 :

class testclass: 
    def __init__(self): 
     print "new instance" 
     self.myList = [] 

의 그것을 시도하자

>>> t1 = testclass() 
new instance 
>>> t2 = testclass() 
new instance 
>>> t1.myList.append(1) 
>>> t2.myList.append(2) 
>>> t1.myList 
[1] 
>>> t2.myList 
[2] 
당신은 클래스 속성에 관심이 있다면

이보고에서을 Class documentation. 파이썬의 클래스는 (거의) 파이썬의 모든 것처럼 객체이기도하므로, 자신의 속성을 가질 수 있습니다. 그것은하지 객체 인스턴스화 시간에, 클래스의 본문에 선언되어 있기 때문에

3

myList을 클래스 내부에 선언 한 방식은 클래스입니다.

class testclass: 
    def __init__(self): 
     print "new instance" 
     self.myList=[] 
1

네,이 속성에 대한 어떤 클래스이기 때문에 : 당신이 예를 속성이 다음과 같이 선언 할 의도 경우는 예상되는 동작을해야합니다. 인스턴스 변수를 원하면 인스턴스 자체에 선언해야합니다. 일반적으로 메서드 내에서 self을 사용합니다.

0
class testclass: 

    def __init__(self): 
     self.myList=[] 
     print "new instance" 
1

myList클래스 인스턴스화시에 초기화됩니다.

인스턴스에서 같은 이름의 변수가 만들어 질 때까지 이러한 속성은 인스턴스와 공유됩니다.

따라서, 귀하의 경우, 동일한 myList 개체에 액세스 (과에 값을 추가) 각 객체를 사용하고 있습니다.

0

myList를 인스턴스 변수로 만들려면 init 함수 내에 self.myList를 정의해야합니다. 그러면 예상대로 행동을 취해야합니다. 지금 당장은 myList가 클래스 변수이며 클래스의 모든 인스턴스에서 공유됩니다.

+1

개체에 대한 할당 전에 만 공유됩니다. – Marcin

+0

귀하의 의견을 이해할 수 있는지 확실하지 않습니다. 클래스 변수가 항상 모든 인스턴스에서 공유되지 않습니까? 클래스 변수와 인스턴스 변수로 정의 된 myList가있는 경우에도 여전히 별개의 것이므로 하나에 대한 할당은 다른 변수에 영향을 미치지 않습니다. 내가 놓친 게 있니? – Pierce

+0

그건 내 요점이다. 인스턴스의 변수에 할당 한 경우 더 이상 해당 인스턴스를 사용하여 클래스 변수에 액세스 할 수 없습니다 (인스턴스 변수를 삭제하지 않는 한). – Marcin