2013-08-30 2 views
0

이 파이썬 코드를 실행하면 아래 출력이 생성됩니다.파이썬은 사전으로 이상하게 작동합니다.

class A(object): 
    a = 0 
    n = {} 

    def inc(self): 
     self.a += 1 

    def add(self, key, obj): 
     self.n[key] = obj 

    def printn(self): 
     print self.a 
     print self.n 


b = A() 
c = A() 

b.add("asf", "----") 
c.add("asdf", "====") 

b.inc() 
c.inc() 

b.printn() 
c.printn() 

출력 :

1 
{'asf': '----', 'asdf': '===='} 
1 
{'asf': '----', 'asdf': '===='} 
+2

을,이 또한 의미에서 아주 좋은 질문하지 않습니다 당신이있어 무엇의 유일한 표시 묻는 것은 모호한 것에 관한 것입니다. 제 생각에, 당신이 예상 한대로하지 않는 것 같습니다. 일반적으로 당신이 더 구체적 일수록 더 좋은 사람들이 당신을 도울 수 있습니다. – martineau

답변

5

문제는 n가 사전되고 함께 할 수 없다; n은 인스턴스 속성 대신 클래스 속성입니다. 즉, 클래스의 모든 인스턴스가 단일 값을 공유한다는 의미입니다.

해결 방법은 클래스 정의가 아닌 메소드 (일반적으로 __init__ 메서드) 내에서 변수를 인스턴스 변수로 지정하는 것입니다.

class A(object): 
    def __init__(self): 
     self.n = {} 

a과 같은 일이 발생하지 않는 이유는 무엇입니까? 음, 입니다. n과 마찬가지로 하나의 공유 된 a을 만듭니다.

그러나 int은 변경할 수 없으므로 변경할 수는 없습니다 (실제로 변경할 수 없으므로 변경 방법이 없음). a은 변경할 수 없습니다. n을 사용하면 그 self.n[key] = object은 메서드 호출 (실제로는 self.n.__setitem__(key, object))처럼 보이지 않을 수도 있지만, 여기서 중요한 것은 n의 값을 변경한다는 것이 확실합니다.

그냥 self.a에 새 값을 지정하는 것입니다. 이는 동일한 이름의 클래스 속성을 어둡게하는 새로운 인스턴스 속성을 생성합니다. 이는 혼란 스럽지만 원하는대로 작동합니다. 새 값을 구축하고 self.n에 할당하여 바로 원하는 경우 n와 같은 동작을 얻을 수 :

def add(self, key, obj): 
    new_n = copy.copy(n) 
    new_n[key] = obj 
    self.n = new_n 
0
n = {} 

이것은 무엇을 다른 언어에서와하지 않습니다. 다른 언어에서는 빈 dict로 항상 초기화되는 인스턴스 속성을 선언 할 것으로 기대할 수 있습니다. 파이썬에서는 클래스 속성을 생성합니다. 모든 인스턴스는 동일한 n을 공유합니다.

이 그것을 해결 생성자를 작성하고 self의 속성을 설정하려면 : 중복되는 옆

def __init__(self): 
    self.a = 0 
    self.n = {} 
관련 문제