将变量设置为None或删除它之间有区别吗?

csh*_*in9 8 python python-2.7

如果通过设置清除变量,性能或内存是否会有明显差异

x = 'something'
x = None
Run Code Online (Sandbox Code Playgroud)

而不是

x = 'something'
del x
Run Code Online (Sandbox Code Playgroud)

对于很多变量?

tim*_*geb 10

如果是对该字符串对象的最后一次引用,两次都'something'将回收内存.在第一个示例中,您使用了更多的内存,因为您保留了名称. xx

我做了一些搜索,看起来内存将立即回收:进一步阅读.

然而,存在概念上的差异,并且您的程序将表现不同.当你del x,你取消绑定名称x,并尝试使用该名称将引发NameError:

>>> x = 'something'
>>> del x
>>> x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
Run Code Online (Sandbox Code Playgroud)

当你设置x = None重新绑定 x到该对象是一个名字None,而且还可以使用变量如预期.例如,对于truthy/falsy测试:

>>> x = None
>>> if not x:
...     print('hello cshin9!')
... 
hello cshin9!
Run Code Online (Sandbox Code Playgroud)


Lar*_*ijn 6

将变量设置为 None 或删除它都会导致x释放对对象的引用。主要区别在于x = None名称x仍然存在,即使它现在指向不同的对象 ( None)。使用时del该名称也会被删除。

对于垃圾收集器来说,没有区别。del不强制对引用的对象进行任何垃圾回收。

编辑:正如@Viroide指出的,使用del会在尝试调用变量时引发异常x

  • 根据 https://docs.python.org/2/library/gc.html `gc.collect()` 将强制垃圾收集器释放未引用的内存。我不知道显式释放单个变量的方法,并且我怀疑这样的方法是否存在。 (3认同)