您是否更喜欢使用del或重新分配给None(垃圾收集)

Red*_*d15 23 python

考虑以下代码:

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 ?
Run Code Online (Sandbox Code Playgroud)

哪个更好的python清理?

Cat*_*lus 27

垃圾收集没有区别 - 在这两种情况下self.fps_display都会释放对指向的对象的引用 .您应该使用哪一个取决于您是否希望名称仍然存在(尽管现在指向不同的对象None),或者不是.

  • 所以实际上del不会直接调用垃圾收集进程,它只会减少refcounter然后将变量挂在垃圾空间中以便收集器清理? (4认同)
  • @ Red15:正确. (4认同)
  • 我通常会去指定`None`,因为如果self.fps_display是None,那么它比'if hastrtr(self,"fps_display")`更容易(和更漂亮).例外情况如果某些不同的含义需要"无"(但我会使用"省略号"代替"不存在"). (2认同)

S.L*_*ott 16

你有一个具有属性的对象fps_display.

您不应该使该属性奇怪地可选或有时会丢失.

如果它是一流属性 - 并且合理可见 - 则必须将其设置None为释放任何资源.删除该属性令人毛骨悚然,因为该对象现在具有可选属性并引发了惊人的异常.

self.fps_display = None
Run Code Online (Sandbox Code Playgroud)


And*_*röm 5

不同之处在于它self.fps_display = None会释放它引用的任何内容,但保留名称,即使它只是引用 None(这是一种类型,NoneType)。

另一方面,del self.fps_display将完全删除名称及其引用的内容。如果您此后尝试使用self.fps_displayAttributeError 将被抛出(或 NameError 在普通变量的情况下)。

因此在实践中,通过将 None 分配给一个名称,您仍然可以在表达式中使用它,而使用 del 则完全删除名称。在第一种情况下,需要几个字节来将名称保留在内存中,而后者则完全清除所有内存使用情况。

一些代码来说明:

import sys
import gc

x = 'Some text here to give the variable a decent size'
y = 2
print('x value before deletion: {}'.format(x))
print('x size before deletion: {} bytes'.format(sys.getsizeof(x)))
print('y value before deletion: {}'.format(y))

x = None
del y
gc.collect() # Not really needed, just to show garbage collection has been done hereafter

print('x value after deletion: {}'.format(x))
print('x size after deletion: {} bytes'.format(sys.getsizeof(x))) # A few bytes needed to keep symbol name
print('x type after deletion: {}'.format(type(x)))

if not x:
    print('Can still use x!')

print('y value after deletion: {}'.format(y)) # Will throw NameError (AttributeError in case of class property)
Run Code Online (Sandbox Code Playgroud)

输出:

x value before deletion: Some text here to give the variable a decent size
x size before deletion: 98 bytes
y value before deletion: 2
x value after deletion: None
x size after deletion: 16 bytes
x type after deletion: <class 'NoneType'>
Can still use x!
Traceback (most recent call last):
  File "Untitled.py", line 21, in <module>
    print('y value after deletion: {}'.format(y)) # Will throw NameError (AttributeError in case of class property)
NameError: name 'y' is not defined
Run Code Online (Sandbox Code Playgroud)

学分