2012-12-11 2 views
3

나는 시험에서 아래의 코드를 가지고 처음으로 당신이 f2 = f1을 할 때 왜 f1.set()f2을 변경하고, 이해가 안하지만 그 후 당신은 f1 = Foo("Nine", "Ten") 전혀 f2을 변경하지 않습니다 설정할 때. 아무도 이유를 모르는 경우 나에게 설명해주십시오. 정말 고맙습니다!파이썬 - 클래스 가변성

코드 :

class Foo(): 
    def __init__(self, x=1, y=2, z=3): 
     self.nums = [x, y, z] 

    def __str__(self): 
     return str(self.nums) 

    def set(self, x): 
     self.nums = x 

f1 = Foo() 
f2 = Foo("One", "Two") 

f2 = f1 
f1.set(["Four", "Five", "Six"]) 
print f1 
print f2 

f1 = Foo("Nine", "Ten") 
print f1 
print f2 

f1.set(["Eleven", "Twelve"]) 
print f1 
print f2 

결과 : 모두 f1f2Foo같은 인스턴스에 대한 참조입니다이 문 후

['Four', 'Five', 'Six'] 
['Four', 'Five', 'Six'] 
['Nine', 'Ten', 3] 
['Four', 'Five', 'Six'] 
['Eleven', 'Twelve'] 
['Four', 'Five', 'Six'] 
+3

지금 시험에 응시하고 있습니까? – Woot4Moo

+1

이 오래된 대답이 도움이됩니까? [Python 목록에 변수 변경, Python 입문]이 반영되지 않았습니다. (http://stackoverflow.com/questions/12080552/12080644#12080644) –

+2

이 코드는 [Python Tutor] (http : // www. .pythontutor.com). – Marius

답변

5
f2 = f1 

. 따라서 하나의 변경은 다른 하나에 영향을 미칩니다. 이 후

f1 = Foo("Nine", "Ten") 

, f1은 너무 f1f2 더 이상 어떤 식 으로든 연결되어 새로운Foo 인스턴스에 할당 - 그래서 다른 일 개 것이다 하지 효과의 변화.