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

Usunięta treść Dodana treść
m poprawa nawigacji
ort
Linia 33:
 
# Za każdym razem, gdy funkcja <tt>leakmem</tt> jest wywoływana, zostaje utworzona instancja klasy <tt>FileInfo</tt> przypisana do zmiennej <tt>f</tt>, która jest lokalną zmienną wewnątrz funkcji. Wtedy funkcja kończy się bez jakiegokolwiek zwolnienia zmiennej <tt>f</tt>, a więc spodziewalibyśmy się wycieku pamięci, lecz tak nie będzie. Kiedy funkcja się kończy, lokalna zmienna <tt>f</tt> wychodzi poza swój zakres. W tym miejscu nie ma więcej żadnych referencji do nowej instancji <tt>FileInfo</tt>, ponieważ nigdzie nie przypisywaliśmy jej do czegoś innego niż <tt>f</tt>), tak więc Python zniszczy instancję za nas.
# Nie zależnieNiezależnie od tego, jak wiele razy wywołamy funkcję <tt>leakmem</tt>, nigdy nie otrzymamy wycieku pamięci, ponieważ za każdym razem kiedy to zrobimy Python będzie niszczył nowo utworzony obiekt przed wyjściem z funkcji <tt>leakmem</tt>.
 
Technicznym terminem tego sposobu odśmiecania pamięci jest „zliczanie odwołań”. Python przechowuje listę referencji do każdej utworzonej instancji. W powyższym przykładzie, mamy tylko jedną referencję do instancji <tt>FileInfo</tt> -- zmienną <tt>f</tt>. Kiedy funkcja się kończy, zmienna <tt>f</tt> wychodzi poza zakres, więc licznik odwołań zmiejsza się do <tt>0</tt> i Python niszczy tę instancję automatycznie.