2014-02-17 6 views
1

아래에서 Any 인스턴스의 목록을 만든 다음이 목록을 수정하고 마지막으로 무작위로이 목록의 일부 요소를 선택하여 새 목록을 작성했습니다. 그때 독립적으로 수정할로메모리 누출 피하기

from random import choice 
import copy 

class Any(): 
    def __init__(self,x): 
     self.x=x 

    def modify (self): 
     self.x += choice([0,1]) 
     return self 

def create_new_list (old_list): 
    new_list = [copy.deepcopy(old_list[choice(range(len(old_list)))]) for i in range(len(old_list))] 
    return new_list 


a = [Any(0),Any(19),Any(3),Any(10)] # Create the original list 
for iteration in xrange(20): 
    [i.modify() for i in a] 
    a = create_new_list(a) 
  1. 나는 이전 목록의 요소를 복사 할 의무가 있어요. 맞습니까?

  2. 이 시스템 때문에 모든 루프에서 Any이라는 새로운 인스턴스가 생성되어 메모리 누수 문제가 발생합니다. 맞습니까?

  3. 어떻게 피할 수 있습니까?

    3A) 내가 기능 create_new_list의 끝에서

    old_list 추가하면?

    3B), 또는 I는 create_new_list 끝에

    델 old_list

    [old_list에 대한 I) 델 (I]

    추가 하는가?

    3c) 다른 효율적인 솔루션이 있습니까?

+0

메모리 누수는 할당 된 메모리가 해제되지 않은 경우입니다. 파이썬에는 가비지 콜렉션이 있으므로 메모리 누출은 없습니다. – StoryTeller

+0

리스트'a'의 첫 번째 인스턴스는 더 이상 참조하지 않을 때, 즉'create_new_list'에서 반환 된리스트를'a'에 할당 할 때 릴리스 또는 가비지 콜렉션에 적합합니다. 누수가 없습니다. – Useless

답변

1

귀하의 경우 아니요, 아무 것도 복사 할 필요가 없습니다.

또한 명시 적으로 할당을 해제 할 필요가 없습니다. 더 이상 참조되지 않으면 가비지 수집됩니다.

+0

흠, 나는 완전히 요점을 얻지 못합니다. 새 목록에없는 모든 인스턴스. 그들에게 무슨 일이 일어 났습니까? 그들은 기억을 취하지, 그렇지? 쓰레기 수거됩니다. 그들이 기억에서 지워질 것이라는 의미입니까? 가비지 콜렉션에 들어가기 전에 인스턴스를 참조하지 않아야하는 기간은 얼마나됩니까? –

+0

파이썬 가비지 콜렉션은 더 이상 다른 것을 참조하지 않으면 (즉 가비지 콜렉션의 일반적인 방법) 메모리에서 객체를 삭제합니다. 파이썬이 가비지 콜렉션을 수행하는 경우의 세부 사항은 다소 복잡하지만 잘 설명되어 있습니다. http://stackoverflow.com/questions/4484167/details-how-python-garbage-collection-works 일반적으로 가비지 수집에 대한 걱정은 대개 Python과 같은 언어의 실수입니다. 대신 코드를 프로파일 링하고 실제 문제가 발생한 위치를 확인하십시오. – Namey

+0

@Namey 귀하의 의견에 많이 감사드립니다! –