如果通过设置
清除变量,性能或内存是否会有明显差异x = 'something'
x = None
而不是
x = 'something'
del x
对于很多变量?
答案 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]
。
将
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。但是删除变量会使变量无法通过从上下文中删除而变得无法访问。