d.clear()"和"d={}"的区别

4 投票
2 回答
1200 浏览
提问于 2025-04-15 22:07

在我的电脑上,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() 是否也会这样做,但逐个删除所有的键肯定是会的。

撰写回答