2012-08-08 6 views
0

작년에 파이썬을 배웠고 새 프로젝트로 다시 돌아가고있었습니다. 나는 처음에 걸림돌을 때렸고, 문서를 뚫고 나서는 여전히 난처한 상황에 처해있다. 나는 그것이 단순한 무엇인가 믿어야한다. 그러나 나는 그것을 발견 할 수 없다.예기치 않게 인스턴스 속성이로드되었습니다.

내가 파일에 설정 한 다음 한 : 여기에 문제의 대화 형 프롬프트에서 다음

class Wrapper(object): 
    def __init__(self, title=None): 
     self.header = Thing("HEADER") 
     if title is not None: 
      self.header.content.append(Thing("TITLE", content=[str(title)])) 
     self.body = Thing("BODY") 
     self.content = Thing("COMPLETE", content=[self.header, self.body]) 

class Thing(object): 
    def __init__(self, name, content=[]): 
     self.name = name 
     self.content = content 

내가 할 :

>>> import things 
>>> a = things.Wrapper("This is a title") 

을 지금, 나는 그 시점에서 기대 body 속성이 a이면 "BODY"이고 빈 목록으로 구성된 contentThing 인스턴스가됩니다. 내가 궁금한 점은 그 content이 실제로 "TITLE" 인스턴스가 들어있는 목록이며 a.header.content이 들어 있다는 것입니다.

>>> a.header.name 
'HEADER' 
>>> a.header.content 
[<test.Thing object at 0xb752290c>] 
>>> a.body.name 
'BODY' 
>>> a.body.content 
[<test.Thing object at 0xb752290c>] 
>>> a.body.content[0].name 
'TITLE' 
>>> a.body.content[0].content 
['This is a title'] 

나는 내 인생에 그런 식으로 할당 됐는지 a.body.content 알아낼 수 없기 때문. 누구든지 이것에 대해 밝힐 수 있습니까? 기본 인터프리터가 제 기능을 생성 할 때 디폴트 파라미터 번만 계산되는대로

+4

이 답변/설명을 보시기 바랍니다 : [ "Python : Least Astonishment": 기본 가변 인수] (http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default- 인수) –

답변

1

은 []이

class Thing(object): 
    def __init__(self, name, content=None): 
     if content is None: 
      content = [] 
     self.name = name 
     self.content = content 

문제를보십시오. int 또는 기타 불변의 경우 유형은 괜찮 으면 사용하지만 변경 가능 유형 (목록, 사전 등)을 변경하면 문제가 발생합니다. 무슨 일이 일어나는지는 Thing의 모든 인스턴스가 동일한 content을 공유한다는 것입니다.

이 방법은 빈 목록이 새 목록마다 시간을 만들어 생성자를 호출 각 시간이 생성됩니다.

+0

그게 작동하지만 ... 원래의 실패 이유는 무엇입니까? – glibdud

+0

수정 사항을 참조하십시오. 당신이 가변성을 이해할 때까지는 조금 복잡합니다 –

+0

알겠습니다. 그리고 g.d.d.c는 위의 멋진 링크를 추가했습니다. 감사! – glibdud

관련 문제