2014-04-13 5 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> 

Po zwolnieniu lokalizacji pamięci przydzielonej do pierwszego obiektu T() (0x03328E10)? Czy to jest, gdy zmienna x jest nadpisywana lub kiedy uruchamiany jest garbage collecter lub kiedy skrypt się kończy?Co dzieje się z lokalizacjami w pamięci w Pythonie podczas nadpisywania zmiennej?

Domyślam się, że działa to, gdy działa garbage collector, ale nie wiem, jak przetestować to założenie.

+0

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

Odpowiedz

3

Zarządzanie pamięcią w Pythonie w przeważającej części odbywa się za pomocą liczenia odwołań, a nie w przypadku czyszczenia pamięci. Kiedy licznik odniesie się do zera, pamięć jest dostępna do ponownego przydziału.

Śmieciarz wchodzi w grę tylko wtedy, gdy masz odwołania kołowe, co nie ma miejsca w tym przypadku.

1

Po pierwsze, zależy to od używanej wersji Pythona. CPython, implementacja referencyjna, wykonuje liczenie odwołań, co oznacza, że ​​twoje założenie jest prawidłowe. Możesz przetestować to założenie, stosując metodę __del__.

Jest jednak złą praktyką unikanie. Na przykład PyPy, IronPython i Jython zamiast tego zbierają śmieci, więc twoje założenie nie jest gwarantowane.

W jaki sposób można zaimplementować finalizację zasobów w Pythonie? Zamiast tego użyj context managers. Menedżerowie kontekstu to: RAII funkcja Python offers.

Powiązane problemy