d.clear()"和"d={}"的区别
在我的电脑上,d.clear()
和 d={}
的执行速度差别超过100纳秒,所以我很好奇为什么有人会选择用其中一个而不是另一个。
import timeit
def timing():
d = dict()
if __name__=='__main__':
t = timeit.Timer('timing()', 'from __main__ import timing')
print t.repeat()
2 个回答
19
这两者的区别在于,d = {}
是创建一个新的字典,而 d.clear()
只是把你已经有的字典清空。如果你的代码中还有其他地方引用了这个字典,这个细微的区别就很重要。在第一种情况下,那些其他的对象不会看到任何变化,因为你并没有修改原来的字典。下面的代码展示了这个区别。
创建一个新的字典:
>>> d = {'foo': 'bar'}
>>> d2 = d
>>> d = {}
>>> d2
{'foo': 'bar'}
清空现有的字典:
>>> d = {'foo': 'bar'}
>>> d2 = d
>>> d.clear()
>>> d2
{}
6
d={}
是用来创建一个新的字典。
d.clear()
是用来清空这个字典的。
如果你用 d={}
,那么所有指向 d
的地方都会指向之前的那个 d
。这可能会引发一些错误。
如果你用 d.clear()
,那么所有指向 d
的地方现在都会指向被清空后的字典,如果这不是你想要的结果,也可能会出错。
另外,我觉得 d.clear()
在 CPython 中并不会释放 d
占用的内存。为了性能,CPython 在删除字典里的元素时并不会把内存释放掉,因为字典通常是用来构建一个大的字典,偶尔才会删掉一些元素。重新分配内存(并确保哈希表的一致性)在大多数情况下会花费太多时间。相反,它会在字典里留下些“垃圾”(这是邮件列表上的技术术语),这些垃圾表示之前有元素在,但现在已经被删除了。不过,我不太确定 d.clear()
是否也会这样做,但逐个删除所有的键肯定是会的。