Zanurkuj w Pythonie/Tworzenie instancji klasy: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Piotr (dyskusja | edycje)
mNie podano opisu zmian
Derbeth (dyskusja | edycje)
dr.
Linia 42:
Technicznym terminem tego sposobu odśmiecania pamięci jest "zliczanie odwołań" ([[w:Reference counting|zobacz w Wikipedii]]). Python przechowuje listę referencji do każdej utworzonej instancji. W powyższym przykładzie, mamy tylko jedną referencję do instancji <code>FileInfo</code> -- zmienną <code>f</code>. Kiedy funkcja się kończy, zmienna <code>f</code> wychodzi poza zasięg, więc licznik odwołań zmniejsza się do <code>0</code> i Python zniszczy tę instancję automatycznie.
 
W poprzednich wersjach Pythona występowały sytuacje, gdy zliczanie odwołań zawodziło i Python nie mógł wyczyścić po nas pamięci. Jeśli tworzyliśmy dwie instancje, które odwoływały się do siebie nawzajem (np. instancja listy dwukierunkowej <ref>ang. ''double linked list''</ref>, w których każdy węzeł wskazuje na poprzedni i następny znajdujący się w liście), żadna instancja nie była niszczona automatycznie, ponieważ Python uważał (poprawnie), że ciągle mamy referencję do każdej instancji. Od Pythona 2.0 mamy dodatkowy sposób odśmiecania pamięci, nazywany po ang. ''mark-and-sweep'' (oznacz i zamiataj, [[w:Garbage collection#Mark and Sweep|zobacz w Wikipedii]]), dzięki któremu Python w sprytny sposób wykrywa różne wirtualne blokady i poprawnie czyści cykliczne odwołania.
 
Podsumowując, w języku tym można po prostu zapomnieć o zarządzaniu pamięcią i pozostawić tę sprawę Pythonowi.
Linia 49:
* [http://www.python.org/doc/current/lib/ Python Library Reference] omawia [http://www.python.org/doc/current/lib/specialattrs.html wbudowane atrybuty podobne do <code>__class__</code>]
* [http://www.python.org/doc/current/lib/ Python Library Reference] dokumentuje [http://www.python.org/doc/current/lib/module-gc.html moduł <code>gc</code>], który daje niskopoziomową kontrolę nad odśmiecaniem pamięci
 
<noinclude>
<noinclude>{{Nawigacja|Zanurkuj w Pythonie|
[[../Definiowanie klas/]]|
[[../Klasa opakowująca UserDict|Klasa opakowująca <code>UserDict</code>]]|
}}
{{Podświetl|py}}</noinclude>
</noinclude>