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