2013-08-12 2 views
0

파이썬의 기본 인수를 혼동스럽게 생각합니다. 여기 내 코드는 다음과 같습니다.파이썬의 기본 인수

#!/usr/bin/env python 
import sys 
class Node(object): 
    def __init__(self, ID=str(), items=[]): 
     self.ID = ID 
     self.items = items 

if __name__ == '__main__': 
    a = Node('1') 
    b = Node('2') 
    b.items.append('sth.') 
    c = Node('3') 
    print a.items 
    print b.items 
    print c.items 

The output is: 
['sth.'] 
['sth.'] 
['sth.'] 

방금 ​​인스턴스를 변경합니다. 모든 인스턴스가 변경되는 이유는 무엇입니까?

+0

예, 가능 중복 ... –

답변

3

이것은 참고 사항입니다. 목록 items은 변경할 수 있으므로 (내부 메서드로 직접 변경할 수 있음) 모든 함수에서 변경하면 모든 참조에 반영됩니다.

예를 들어, 다음 코드가있는 경우 : a가 변경 가능한 목록이며, 그래서 참조에 의해 전달되기 때문에

def f(x): 
    x.append(5) 

a = [1, 2, 3] 
f(a) 
# a is now [1, 2, 3, 4], even in the global scope 

이 발생합니다.

items = []을 사용할 때 새 인스턴스를 만들 때마다 이 아니며이 아닌 빈 목록이 만들어집니다. 대신, 각 인스턴스는 클래스가 "선언"되었을 때 작성된 동일한 목록을 참조합니다. 따라서 각 인스턴스는 동일한 목록을 참조하기 때문에 모두 변경됩니다.

기타 문의 사항이 있으시면 [python] None as default argument으로 문의하십시오.

+0

파이썬은 매개 변수가 변경 가능한지 여부를 절대 확인하지 않으며, 해당되는 경우 참조로 전달합니다. 나는 사람들이 다르게 좋은 대답으로 이것을 반복하지 않기를 바란다. – geoffspear

+0

@Wooble 무슨 뜻인지 확실 히 모르겠습니다. 나는 단지 변경 가능한 객체가 참조로 전달되었다고 말하고있다. –

+0

그들은 그렇지 않습니다. 파이썬은 참조로 전달하지 않습니다. 나는 http://stackoverflow.com/a/986145/110707을 읽을 것을 제안한다. – geoffspear