考虑以下代码:
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
),或者不是.
S.L*_*ott 16
你有一个具有属性的对象fps_display
.
您不应该使该属性奇怪地可选或有时会丢失.
如果它是一流属性 - 并且合理可见 - 则必须将其设置None
为释放任何资源.删除该属性令人毛骨悚然,因为该对象现在具有可选属性并引发了惊人的异常.
self.fps_display = None
Run Code Online (Sandbox Code Playgroud)
不同之处在于它self.fps_display = None
会释放它引用的任何内容,但保留名称,即使它只是引用 None(这是一种类型,NoneType)。
另一方面,del self.fps_display
将完全删除名称及其引用的内容。如果您此后尝试使用self.fps_display
AttributeError 将被抛出(或 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)