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

tsh*_*ang 4 python timing

在我的机器上,执行速度d.clear()和之间的执行速度d={}超过100ns,所以很奇怪为什么会使用一个而不是另一个.

import timeit

def timing():
    d = dict()

if __name__=='__main__':
    t = timeit.Timer('timing()', 'from __main__ import timing')
    print t.repeat()
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 19

不同之处在于d = {}创建一个新词典并d.clear()清空您已有的词典.如果您的代码中有其他位置包含对词典的引用,则这种细微差别很重要.在第一种情况下,由于您尚未修改原始字典,因此其他对象将看不到任何更改.以下代码显示了这种差异.

创建一个新词典:

>>> d = {'foo': 'bar'}
>>> d2 = d
>>> d = {}
>>> d2
{'foo': 'bar'}
Run Code Online (Sandbox Code Playgroud)

清除现有字典:

>>> d = {'foo': 'bar'}
>>> d2 = d
>>> d.clear()
>>> d2
{}
Run Code Online (Sandbox Code Playgroud)

  • @Tshepang:我简化了一些例子.您很可能希望将对字典的引用传递给另一个类,以便它们可以使用它.然后,如果您需要更改字典,那么您应该决定是否更新已经发出的字典,或者创建一个新字典并保留旧字典.两种选择都有意义. (4认同)
  • @Tshepang:您认为哪一个容易出错?你使用的那个取决于你想要发生什么. (2认同)

wis*_*sty 6

d={} 创建一个新词典.

d.clear() 清除字典.

如果你使用d={},那么指向的任何东西d都将指向旧的d.这可能会引入一个错误.

如果您使用d.clear(),那么指向的任何内容d现在将指向已清除的字典,如果这不是您想要的,这也可能会引入错误.

另外,我不认为d.clear()(在CPython中)会释放占用的内存d.为了提高性能,当你删除元素时,CPython 不会从字典中删除内存,因为字典的通常用法是构建一个大字典,并且可能修剪掉一些元素.重新分配内存(并确保哈希表保持一致)在大多数用例中花费的时间太长.相反,它填充字典turds(这是邮件列表上的技术术语),表明一个元素曾经存在,但自从被删除.我不完全确定是否d.clear()这样做,但一个接一个地删除所有键确实如此.