当前位置:  开发笔记 > 编程语言 > 正文

在Python中dict.clear()和赋值{}之间的区别

如何解决《在Python中dict.clear()和赋值{}之间的区别》经验,为你挑选了6个好方法。

在python中,调用clear()和分配{}字典有区别吗?如果是,那是什么?例:

d = {"stuff":"things"}
d.clear()   #this way
d = {}      #vs this way



1> Greg Hewgill..:

如果你有另一个变量也引用同一个字典,那就有很大的区别:

>>> d = {"stuff": "things"}
>>> d2 = d
>>> d = {}
>>> d2
{'stuff': 'things'}
>>> d = {"stuff": "things"}
>>> d2 = d
>>> d.clear()
>>> d2
{}

这是因为赋值d = {}创建了一个新的空字典并将其分配给d变量.这留下d2指向旧字典,其中仍有项目.但是,d.clear()清除同一个字典,dd2指向两者.


虽然你的"无变量"陈述是迂腐的,但在这里并没有多大帮助.只要Python语言文档仍然讨论"变量",我仍然会使用这个术语:http://docs.python.org/reference/datamodel.html
=复制对名称的引用.python中没有变量,只有对象和名称.
我发现tzot的评论有助于调整我对名称,变量和副本类型的思考.把它称为迂腐可能是你的看法,但我觉得这是一种不公正的严厉判断.
谢谢.这是有道理的.我仍然要习惯于在python中创建引用的心态...

2> Michel..:

d = {}将创建一个新实例,d但所有其他引用仍将指向旧内容. d.clear()将重置内容,但对同一实例的所有引用仍然是正确的.



3> 小智..:

除了其他答案中提到的差异外,还存在速度差异.d = {}快了两倍:

python -m timeit -s "d = {}" "for i in xrange(500000): d.clear()"
10 loops, best of 3: 127 msec per loop

python -m timeit -s "d = {}" "for i in xrange(500000): d = {}"
10 loops, best of 3: 53.6 msec per loop


对于所有情况,这不是真正有效的速度测试,因为dict是空的.我认为制作一个大的dict(或者至少是一些内容)会产生一个小得多的性能差异......而且我怀疑垃圾收集器可能会给d = {}(?)添加一些自己的伤害
@Rafe:我想说的是,如果我们知道没有其他变量指向字典d,那么设置d = {}应该会更快,因为清理整件事可以留给Garbage Collector供以后使用。

4> maxp..:

作为前面提到的事情的例证:

>>> a = {1:2}
>>> id(a)
3073677212L
>>> a.clear()
>>> id(a)
3073677212L
>>> a = {}
>>> id(a)
3073675716L



5> lastland..:

除了@odano的答案之外,d.clear()如果您想多次清除字典,似乎使用速度更快.

import timeit

p1 = ''' 
d = {}
for i in xrange(1000):
    d[i] = i * i
for j in xrange(100):
    d = {}
    for i in xrange(1000):
        d[i] = i * i
'''

p2 = ''' 
d = {}
for i in xrange(1000):
    d[i] = i * i
for j in xrange(100):
    d.clear()
    for i in xrange(1000):
        d[i] = i * i
'''

print timeit.timeit(p1, number=1000)
print timeit.timeit(p2, number=1000)

结果是:

20.0367929935
19.6444659233


我不确定这种差异是否有意义.无论如何,在我的机器上,结果是相反的!

6> Karoly Horva..:

如果原始对象不在范围内,则变异方法总是有用的:

def fun(d):
    d.clear()
    d["b"] = 2

d={"a": 2}
fun(d)
d          # {'b': 2}

重新分配字典将创建一个新对象,并且不会修改原始对象.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有