2016-08-19 2 views
2

다음 예제의 차이점을 이해할 수 없습니다. 한 번 클래스의 인스턴스는 다른 인스턴스의 클래스 변수를 변경할 수 있으며 다른 시간은 변경할 수 없습니다.클래스 변수 : "class list"vs "class boolean"

예 1

class MyClass(object): 
    mylist = [] 

    def add(self): 
     self.mylist.append(1) 

x = MyClass() 
y = MyClass() 
x.add() 
print "x's mylist: ",x.mylist 
print "y's mylist: ",y.mylist 

출력 :

X의 myList에 [1]

Y의 myList에 [1] 그래서 여기

인스턴스 xA 클래스가 클래스 속성에 액세스하여 수정할 수있었습니다. e mylist 또한 인스턴스 y의 속성 인 A입니다.

예 2 :

class MyBank(object): 
    crisis = False 

    def bankrupt(self) : 
     self.crisis = True 

bankX = MyBank() 
bankY = MyBank() 
bankX.bankrupt() 
print "bankX's crisis: ",bankX.crisis 
print "bankY's crisis: ",bankY.crisis 

bankX의 위기 : 참

bankY의 위기 : 거짓

이유는이 예제에서 작동하지 않는 이유는 무엇입니까?

속성이 인스턴스에 설정되어
def bankrupt(self) : 
    self.crisis = True # self.crisis = something 

, 그것은 항상 설정됩니다 할당이

def add(self): 
    self.mylist.append(1) # NOT self.mylist = something 

초 경우 : 첫 번째 경우에

+5

이 질문 "불변 대 가변"같은 오래된 그렇지 않은 이유를 우리는 하루에 5 번 (플러스 2 이유를 얻을 그런 식으로) 그리고 클래스를 포함하기 때문에 그것은 단지 5 upvotes를 얻을 수 있습니까? 축하합니다. 저는 방금 SO 커뮤니티에서 모든 믿음을 잃었습니다. –

+0

myList가 클래스 변수이고 변경할 수 있습니다 – FujiApple

+0

거의 동일한 예제가있는 [python documentation] (https://docs.python.org/3.5/tutorial/classes.html#class-and-instance-variables)을 참조하십시오. –

답변

6

은 추가 방법에는 할당이 없습니다 특정 인스턴스 만 (인스턴스의 __dict__ atribute에 배치됩니다). 클래스 __dict__은 영향을받지 않습니다.

첫 번째 경우 할당이 없으므로 표준 조회 규칙이 적용됩니다. 인스턴스의 __dict__ 속성에 "mylist"가 없기 때문에 클래스 __dict__으로 되돌아갑니다.

add에서 수행되는 조작은 MyClass.__dict__에 저장된 값을 변경합니다. 그렇기 때문에 모든 경우에 변화가 관찰됩니다.

조각을 다음 고려 (더 나은 문제를 설명 할 수) :

class MyClass: 
    x = [] 

x1 = MyClass() 
x2 = MyClass() 
x3 = MyClass() 

x1.x.append(1) 

print x1.x # [1] 
print x2.x # [1] 
print x3.x # [1] 
assert x1.x is x2.x is x3.x 

x3.x = "new" # now x3.x no longer refers to class attribute 

print x1.x # [1] 
print x2.x # [1] 
print x3.x # "new" 
assert x1.x is x3.x # no longer True! 
+0

그들이 왜 이런 식으로했는지 알아? – uitty400

관련 문제