2014-04-13 12 views
6
In [1]: class T(object): 
    ...:  pass 
    ...: 

In [2]: x = T() 

In [3]: print(x) 
<__main__.T object at 0x03328E10> 

In [4]: x = T() 

In [5]: print(x) 
<__main__.T object at 0x03345090> 

Quando viene liberata la posizione di memoria assegnata al primo oggetto T() (0x03328E10)? È quando la variabile x viene sovrascritta o quando viene eseguito il garbage collector o quando termina lo script?Cosa succede alle posizioni di memoria in Python quando si sovrascrive una variabile?

Suppongo che sia quando viene eseguito il garbage collector ma non so come testarlo.

+0

https://docs.python.org/2/library/gc.html – Alex

risposta

3

La gestione della memoria di Python viene effettuata per la maggior parte tramite il conteggio dei riferimenti, anziché con la garbage collection. Quando il conteggio dei riferimenti passa a zero, la memoria è disponibile per la riallocazione.

Il garbage collector entra in gioco solo quando si dispone di riferimenti circolari, che non è il caso qui.

1

Prima di tutto, dipende dall'implementazione di Python che si sta utilizzando. CPython, l'implementazione di riferimento, fa riferimento al conteggio, il che significa che la tua ipotesi è giusta. È possibile testare tale ipotesi implementando il metodo __del__.

Tuttavia è una cattiva pratica da evitare. Ad esempio, PyPy, IronPython e Jython eseguono invece la garbage collection, quindi la tua ipotesi non è garantita.

Quindi, come è possibile implementare la finalizzazione delle risorse in Python? Utilizzare invece context managers. I gestori di contesto sono RAII offerte Python.

Problemi correlati