在python中,调用clear()
和分配{}
字典有区别吗?如果是,那是什么?例:
d = {"stuff":"things"} d.clear() #this way d = {} #vs this way
如果你有另一个变量也引用同一个字典,那就有很大的区别:
>>> d = {"stuff": "things"} >>> d2 = d >>> d = {} >>> d2 {'stuff': 'things'} >>> d = {"stuff": "things"} >>> d2 = d >>> d.clear() >>> d2 {}
这是因为赋值d = {}
创建了一个新的空字典并将其分配给d
变量.这留下d2
指向旧字典,其中仍有项目.但是,d.clear()
清除同一个字典,d
并d2
指向两者.
d = {}
将创建一个新实例,d
但所有其他引用仍将指向旧内容.
d.clear()
将重置内容,但对同一实例的所有引用仍然是正确的.
除了其他答案中提到的差异外,还存在速度差异.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
作为前面提到的事情的例证:
>>> a = {1:2} >>> id(a) 3073677212L >>> a.clear() >>> id(a) 3073677212L >>> a = {} >>> id(a) 3073675716L
除了@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
如果原始对象不在范围内,则变异方法总是有用的:
def fun(d): d.clear() d["b"] = 2 d={"a": 2} fun(d) d # {'b': 2}
重新分配字典将创建一个新对象,并且不会修改原始对象.