2009-11-05 3 views
4

im은 환상적인 eric4 ide를 사용하여 python을 코딩합니다. 'cyclops'라는 도구가 내장되어있어 사이클을 찾고 있습니다. 그것을 실행 한 후에, 그것은 내 코드에 많은 사이클이 있음을 선언하는 커다란 대담한 붉은 글자들을 내게 준다. 문제는 출력물을 거의 읽을 수 없기 때문에 출력을 읽음으로써 사이클이 무엇인지를 이해할 방법이 없습니다. ive는 몇 시간 동안 웹을 탐색했는데 블로그 게시물만큼 큰 것을 찾지 못합니다. 사이클이 특정 시점까지 쌓이면 프로파일 러와 디버거는 작동을 멈춘다. (.사이클이란 무엇입니까? Python과 관련하여

내 질문은 사이클이란 무엇인지, 어떻게하면 사이클을 만들지, 파이썬에서 사이클을 피할 수 있는지 어떻게 알 수 있습니까? 감사합니다.

답변

4

사이클 (또는 "참조 루프")가 서로 예를 참조하여 둘 이상의 개체 수 있습니다 :

alist = [] 
anoth = [alist] 
alist.append(anoth) 

또는 물론

class Child(object): pass 

class Parent(object): pass 

c = Child() 
p = Parent() 
c.parent = p 
p.child = c 

, 이러한 사이클과 매우 간단한 예입니다 다만 2 개의 품목의; 실제 사례는 종종 길어지기가 더 어렵습니다. 당신이 방금 사이클을 만들었다는 것을 알려주는 마법의 총알은 없습니다. 단지 그것을 지켜보아야합니다. gc 모듈 (특정 작업이 도달 할 수없는 사이클을 가비지 수집하는 것임)은 적절한 디버그 플래그를 설정할 때 기존주기를 진단하는 데 도움이됩니다. weakref 모듈을 사용하면 참조주기를 만들지 않고 자식과 부모가 서로를 알아야 할 필요가있을 때 (예 : 두 개의 상호 참조 중 하나만 약한 참조 또는 프록시로 만들거나 모듈이 제공하는 편리한 사전 컨테이너).

+0

고마워 알렉스 지금, 하나 더, 약한 어린이와 부모가 각각의 다른 존재를 알고있는 유일한 방법은 무엇입니까? – spearfire

+0

@spearfire, 아니, 여러 가지 방법이 있습니다. 결국 사이클을 생성하기로 결정할 수 있습니다. 또는 모든 엔티티를 하나의 고유 한 키가있는 dict에 넣을 수 있으며 다른 엔티티가 엔티티를 직접 참조하는 대신 해당 dict에 해당 키를 보유하도록 할 수 있습니다 (키가 아직 체크되지 않은 경우에만 사용됩니다!) - - 이외에도 여러 가지 방법이 있습니다. –

1

모든 Cyclops는 코드에 다른 객체 체인을 통해 자신을 참조하는 객체가 있는지 여부를 알려줍니다.이 객체는 가비지 수집기가 이러한 종류의 객체를 올바르게 처리하지 않기 때문에 Python의 문제였습니다. 그 문제는 그 후 대부분 수정되었습니다.

결론 : 메모리 누수가 관찰되지 않으면 대부분의 경우 사이클롭스의 출력에 대해 걱정할 필요가 없습니다.

+0

Silas에게 감사 드린다. cyclops는 내가 쓰는 동안 쓰레기로 참조 된 것을 참조하는 것에 대한 참조를하지 않는다. <- 지금은 한 입 가득합니다. – spearfire

관련 문제