2011-07-14 19 views
16

考慮下面的代碼:你更願意使用刪除或重新分配給無(垃圾收集)

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 ? 

哪個是更好的蟒蛇清理?

回答

22

有垃圾收集沒有區別 - 以指向的對象self.fps_display將被釋放的引用在這兩種情況下。您應該使用哪一個取決於您是否希望名稱仍然存在(儘管現在指向不同的對象,None),或者不是。

+2

我通常去分配給'None',因爲它更容易(和更漂亮)去'如果self.fps_display比'如果hasattr(自我 「fps_display」)'None'。如果'None'有一些不同的含義需要例外(但是我會使用'Ellipsis'來代替「不存在」)。 –

+2

所以實際上del並不直接調用垃圾收集過程,它只會減少refcounter,然後將變量懸掛在垃圾空間中以便收集器進行清理? – Red15

+3

@ Red15:正確。 –

13

你有一個屬性對象,fps_display

您不應該使屬性奇怪地可選或有時丟失。

如果它是一個一流的屬性 - 合理可見 - 它必須設置爲None釋放任何資源。刪除屬性令人毛骨悚然,因爲對象現在具有可選屬性並引發驚人的異常。

self.fps_display = None