2009-05-09 2 views

답변

6

변수의 할당이 해제되지 않습니다.

그 객체가 해제되지 않을 수 'some string'의 값을 문자열, 반복해서 재사용이 경우 개체 (.

객체는 어떤 변수가 객체를 참조하지 않는 경우 해제된다.이 생각 .이 경우

a = 'hi mom' 
a = 'next value' 

는, 첫 번째 개체 (값 'hi mom'와 문자열) 더 이상 두 번째 문이 실행되는 스크립트 어디에서나 참조됩니다. 개체 ( 'hi mom')는 메모리에서 제거 할 수 없습니다.

+0

두 번째 단락이 충분하지 않다고 생각합니다. 아마도 '일부 문자열'은 메소드의 코드 객체에서 상수이기 때문에 할당 된 상태이므로 메소드가 존재하는 동안 (일반적으로 프로세스가 끝날 때까지) 참조되며 메모리에 남아 있습니다. – tzot

4

개체를 변수에 할당 할 때마다이 개체의 참조 카운터가 증가합니다.

a = MyObject() # +1, so it's at 1 
b = a # +1, so it's now 2 
a = 'something else' # -1, so it's 1 
b = 'something else' # -1, so it's 0 

아무에게도이 MyObject 개체에 액세스 할 수 없습니다. 우리는 더 이상 첫 번째 줄에서 생성했습니다.

카운터가 0에 도달하면 가비지 수집기가 메모리를 해제합니다.

참조 카운터를 증가시키지 않는 까다로운 참조를 만드는 방법이 있습니다 (예 : 일부 캐시에 객체가 있기 때문에 객체를 메모리에 보관하지 않으려는 경우).

cPython의 참조 계산에 대한 추가 정보는 here입니다.

파이썬은 언어입니다, 파이썬은 (꽤 인기있는) 구현입니다. Afaik 언어 자체는 을 지정하지 않습니다. 메모리가 해제되었습니다.

3

예에서 example.exampleMethod()를 호출하지 않고 결과 (예 : a = example.exampleMethod())를 지정하지 않으면 CPython에서 참조 계산 메커니즘을 사용하므로 바로 CPython에서 할당이 해제됩니다. 문자열은 구현에 최적화 된 수많은 옵션을 가지고 있기 때문에 사용하기 좋은 예제가 아닙니다. 문자열은 캐시 될 수 있으며 재사용 할 수 있도록 할당이 해제되지 않습니다. 이는 문자열이 사전에 키로 사용되기 때문에 매우 유용합니다.

가비지 수집은 구현에 따라 다르므로 CPython, Jython 및 IronPython은 다른 동작을 가지며 대부분이 각각의 sites/manuals/code/etc에 문서화되어 있습니다. 조금 탐험하고 싶다면 del() 메서드를 정의한 클래스를 만드는 것이 좋습니다.이 메서드는 가비지 수집되는 개체 (소멸자)에서 호출됩니다. 전화를 추적 할 수 있도록 무언가를 인쇄하십시오 :)

0

Nico의 답과 마찬가지로, exampleMethod에서 반환 한 결과에 따라 다릅니다. 파이썬 (또는 어쨌든 CPython)은 참조 횟수를 사용합니다. 이 메서드 중 aVar는 문자열을 참조하고 그 이후에는 변수 aVar이 삭제되고 참조가 없어도 삭제됩니다.

다음은 소멸자 ((self))가 있고 "Object 1 being destructed"또는 이와 유사한 것을 인쇄하는 사용자 정의 클래스의 예입니다.gc는 참조 카운트가 0 인 객체를 자동으로 삭제하는 가비지 수집기 모듈입니다. 편리함을 위해 거기에 있습니다. 그렇지 않으면 가비지 수집기가 실행될 때 어떤 보장도 없습니다.

import gc 
class Noisy(object): 
    def __init__(self, n): 
     self.n = n 
    def __del__(self): 
     print "Object " + str(self.n) + " being destructed"  
class example(object): 
    def exampleMethod(self, n): 
     aVar = Noisy(n) 
     return aVar 
a = example() 
a.exampleMethod(1) 
b = a.exampleMethod(2) 
gc.collect() 
print "Before b is deleted" 
del b 
gc.collect() 
print "After b is deleted" 
다음과 같은 결과가 있어야

:이 변수에 할당되지 않는 제 시끄러운 객체 메소드 후에 삭제된다

Object 1 being destructed 
While b lives 
Object 2 being destructed 
After b is deleted 

공지 반환되어 있으므로 참조 카운트를 갖는다 0이지만 두 번째 변수는 변수 b가 삭제 된 후에 삭제되며 참조 카운트는 0입니다.