2011-07-14 12 views
16

Rozważmy następujący kod:wolisz korzystania del lub realokacja None (zbieranie śmieci)

if value and self.fps_display is None: 
    self.fps_display = clock.ClockDisplay() 
elif not value and self.fps_display is not None: 
    self.fps_display.unschedule() 
    # Do this 
    del self.fps_display 
    # or this 
    self.fps_display = None 
    # or leave both in ? 

co jest lepsze oczyszczanie python?

Odpowiedz

22

Nie ma różnicy do zbierania śmieci - w obu przypadkach odniesienie do obiektu wskazywanego przez self.fps_display zostanie zwolniony. Który z nich należy użyć, zależy od tego, czy chcesz nazwę wciąż istnieje (choć teraz skierowany do innego obiektu, None), czy też nie.

+2

I zazwyczaj przejść do przypisywania do 'None', ponieważ łatwiej (i ładniejsza), aby przejść' jeśli self.fps_display jest None' niż 'jeśli hasattr (self, "fps_display")'. Wyjątek, jeśli 'None' jest potrzebny dla jakiegoś innego znaczenia (ale wtedy użyłbym' Ellipsis' zamiast tego, by wskazać "nieobecny"). –

+2

Więc w rzeczywistości del nie wywołuje proces zbierania śmieci bezpośrednio, a jedynie zmniejsza refcounter wtedy i pozostawia zmienną wiszące w przestrzeni śmieci do kolektora do czyszczenia? – Red15

+3

@ Red15: Prawidłowo. –

13

mieć obiekt z atrybutem, fps_display.

Nie należy uczynić atrybut dziwnie opcjonalne lub czasami brakuje.

Jeśli jest to atrybut pierwszej klasy - i rozsądnie widoczne - musi być ustawiony na None celu uwolnienia zasobów. Usunięcie atrybutu jest przerażające, ponieważ obiekt ma teraz opcjonalne atrybuty i wywołuje zdumiewające wyjątki.

self.fps_display = None 
Powiązane problemy