2012-05-17 3 views
1

아무도 나에게 왜이 코드가 '0 1 2 done'대신 '2 1 0 done'을 인쇄 할 것인지 설명해 줄 수 있습니까? 필자가 이해할 수있는 것처럼, 목록 내재 중에 익명의 변수가 생기며, 목록 이해가 끝나지 않으면 필로 원칙을 사용하여 가비지 수집됩니다. 하지만 여전히 목록 aa에서 참조됩니다. 그렇지 않습니까? 그 이유는 두 번째 'del a'가 del이라는 마법 방법을 호출하지 않는 이유는 무엇입니까?Python : 오브젝트 __del__ 메소드 이해하기

class A: 
    def __init__(self, name): 
     self.name = name 
    def __del__(self): 
     print self.name, 

aa = [A(str(i)) for i in range(3)] 
for a in aa: 
    del a 

print 'done' 

고급 질문. 보십시오 http://codepad.org/niaUzGEy 5 부, 왜 3 부입니까? 이건 1 장이 아니야? 왜 5 또는 3입니까? 그걸 묻는 이유는 모르겠다;) 시간 내 주셔서 감사합니다!

+3

하나의 질문에 두 개의 질문을 넣지 마십시오. 두 가지 질문을하십시오. –

+0

http://stackoverflow.com/a/1481512/367273 – NPE

답변

3

done 2 1 0 (CPython)을 인쇄합니다.

for 루프에서 목록 요소를 삭제하지 마십시오. 종료시 삭제됩니다. 지금까지 내가 __del__의 순서를 호출 알고 구현 고유의 것입니다, 그래서 또 다른 구현 (IronPython의, 자이 썬 등)

+1

pypy에서 '2 1 0'은 전혀 인쇄되지 않습니다. – geoffspear

7

당신은 del 문과 __del__ 방법을 혼동 다를 수 있습니다.

del a은 단순히 참조 된 개체에서 이름 a의 바인딩을 해제합니다. aa으로 참조되는 목록은 변경되지 않으므로 개체가 모두 계속 존재합니다.

__del__ 메서드는 개체에 대한 마지막 참조가 소멸 된 후에 만 ​​호출됩니다. 그것은 __del__에 대한 호출 이후 일 수 있지만 일반적으로 그렇지 않습니다.

del을 거의 사용할 필요가 없습니다. aa을 리바 인하는 것이 훨씬 더 일반적이어서 포함 된 모든 객체가 해제 될 것이며, 그렇지 않으면 참조되지 않는 경우 __del__ 메소드가 자동으로 호출됩니다.

또한 __del__을 거의 사용할 필요가 없습니다. 대부분의 목적을 위해 Python의 객체 관리는 자동으로 정리 작업을 처리합니다. __del__ 메서드를 클래스에 추가하는 것은 가비지 수집기를 방해 할 수 있으므로 일반적으로 바람직하지 않습니다. 따라서 역설적으로 __del__은 프로그램에 메모리가 누출 될 가능성을 높입니다. 또한 파이썬은 __del__이 실제로 프로그램 종료시 호출되는지 여부를 보증하지 않으며, 만약 그렇다면 전역 변수를 찾을 수 없으며 더 이상 사용할 수 없으며 한 번만 호출하도록 보장하지 않습니다 (그러나 후프를 뛰어 넘어야 함). 그것을 한 번 이상 부르도록하십시오).

한마디로 가능하면 __del__을 사용하지 마십시오.