2014-02-08 5 views
1

어떻게 작동하는지 이해할 수 없습니다. 아래 코드와 같이 노드의 인스턴스 b가 단어 목록을 어떻게 알 수 있습니까?파이썬 전역 클래스 속성

class Node(): 
def __init__(self,wordList=[]): 
    self.wordList = wordList 

a = Node() 
b = Node() 

a.wordList.append("hahaha!") 
print b.wordList 

하하하! 함수 정의가 평가 될 때 해당 클래스의 모든 인스턴스에서 사용하는 하나의 방법을 가지고 파이썬 기본 인수에

+0

링크 된 질문의 사본으로 폐업해야하는지 확실하지 않습니다. 제목을 다른 사람이 검색 할 수있는 의미있는 이름으로 변경해야합니다. – joaquin

답변

3

그것이 작동하는 방식을 얻을 때까지 파이썬에서 자주 범하는 실수이다. 학생들은 이러한 직관력을 피하는 법을 배웁니다.

문제는 [ ]로 표시 오전 빈 목록입니다 __init__ 방법 wordlist에 대한 기본 매개 변수를 한 번만 생성 즉, 클래스 본문 구문 분석 . 단일 빈리스트 - - 그 후

는 (객체 인스턴스화에 자동 만들어진) __init__ 메소드를 호출 할 때마다 동일한 객체를 전달 함수에 파라미터로서 . 따라서 위 예제에서 Node의 모든 인스턴스는 동일한 목록 (사용자가 발견 한 문제)을 가리 킵니다. 이러한 문제를 방지 할 수

올바른 패턴은 다음과 같이이다 :

class Node(object): 
def __init__(self,wordList=None): 
    if wordlist is None: wordlist = [] 
    self.wordList = wordList 

이 방법은, 새로운 빈 IST는 각 __init__ 호출에서 생성됩니다.

2

이 기능을 유지, 그들은 그 방법에 따라서 하나의 wordList 기본, 한 번 평가 그리고 인스턴스들, 그래서 그들은 C에서 정적 변수처럼 행동한다. 그래서 당신은 변하지 않는 기본 인자를 가지면 안된다. 자세한 내용은 다음을 읽어라. http://effbot.org/zone/default-values.htm

0

이것은 조금 명확하게 될 수 있습니다 즉 ...

41474968 
41474968 

같은 것을 결과

class Node(): 
    def __init__(self,wordList=[]): 
     self.wordList = wordList 

a = Node() 
b = Node() 

print(id(a.wordList)) 
print(id(b.wordList)) 

이 a.wordList 및 b.wordList 모두 참고하여주십시오 같은 목록.