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

时间:2016-03-18 14:51:48

标签: python python-2.7

如果通过设置

清除变量,性能或内存是否会有明显差异
x = 'something'
x = None

而不是

x = 'something'
del x

对于很多变量?

5 个答案:

答案 0 :(得分:10)

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

我做了一些搜索,看起来内存将立即回收:further reading

然而,存在概念差异,并且您的程序将表现不同。当您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

当您将x = None 重新绑定 x设置为对象None的名称时,仍然可以按预期使用该变量。例如,对于truthy / falsy测试:

>>> x = None
>>> if not x:
...     print('hello cshin9!')
... 
hello cshin9!

答案 1 :(得分:3)

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

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

编辑:正如@Viroide指出的那样,使用del会导致在尝试调用变量x时抛出异常。

答案 2 :(得分:2)

我很好奇,所以我决定通过运行此代码来查看模块dis所说的内容:

import dis

def f():
    v = 'x' 
    v = None
    del v 
    return None

print(dis.dis(f))

结果是

  4           0 LOAD_CONST               1 ('x')
              3 STORE_FAST               0 (v)

  5           6 LOAD_CONST               0 (None)
              9 STORE_FAST               0 (v)

  6          12 DELETE_FAST              0 (v)

  7          15 LOAD_CONST               0 (None)
             18 RETURN_VALUE

并且文件说DELETE_FAST

  

删除本地co_varnames[var_num]

LOAD_CONST

  

co_consts[consti]推入堆栈。

因此,就操作/内存而言,LOAD_CONST执行两个操作(其中一个使用内存),我认为只有当你有大量元素(不仅仅是一个)时它才会变得相关 - 因此,您可能希望使用del

这也解释了为什么你不能再访问变量v(因为它已从命名空间中删除,而LOAD_CONST只是另一个赋值)。

答案 3 :(得分:1)

这两个语句在当前命名空间上的操作方式不同:前者只是更改变量的值,而del则完全删除变量。无论如何,x指向的先前值都会被垃圾收集。

性能差异(如果有)可以忽略不计。

答案 4 :(得分:0)

不,它不一样,看下面的例子:

prog_file = open("progress.txt", 'w') 

...

print("Processing file {:.0f} of {} ({:.2%} Completed)".format(current + 1, num_file, current/num_file),
              end='\r', file=prog_file)

设置为无使变量值为None并具有NoneType。但是删除变量会使变量无法通过从上下文中删除而变得无法访问。