问题:Python中dict.clear()与分配{}之间的区别
在python中,调用clear()
和分配{}
给字典之间有区别吗?如果是,那是什么?例:
d = {"stuff":"things"}
d.clear() #this way
d = {} #vs this way
回答 0
如果您还有另一个变量也引用相同的字典,则有很大的不同:
>>> d = {"stuff": "things"}
>>> d2 = d
>>> d = {}
>>> d2
{'stuff': 'things'}
>>> d = {"stuff": "things"}
>>> d2 = d
>>> d.clear()
>>> d2
{}
这是因为分配d = {}
会创建一个新的空字典并将其分配给d
变量。这样就d2
指向旧字典,里面还有项目。但是,d.clear()
清除相同的字典,d
并且d2
两者都指向。
回答 1
d = {}
将为创建新实例,d
但所有其他引用仍将指向旧内容。
d.clear()
将重置内容,但是对同一实例的所有引用仍然正确。
回答 2
除了其他答案中提到的差异外,还存在速度差异。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
回答 3
为了说明前面已经提到的事情:
>>> a = {1:2}
>>> id(a)
3073677212L
>>> a.clear()
>>> id(a)
3073677212L
>>> a = {}
>>> id(a)
3073675716L
回答 4
除了@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
回答 5
如果原始对象不在范围内,则突变方法总是有用的:
def fun(d):
d.clear()
d["b"] = 2
d={"a": 2}
fun(d)
d # {'b': 2}
重新分配字典将创建一个新对象,而不会修改原始对象。
回答 6
未提及的一件事是范围界定问题。这不是一个很好的例子,但是在这种情况下,我遇到了问题:
def conf_decorator(dec):
"""Enables behavior like this:
@threaded
def f(): ...
or
@threaded(thread=KThread)
def f(): ...
(assuming threaded is wrapped with this function.)
Sends any accumulated kwargs to threaded.
"""
c_kwargs = {}
@wraps(dec)
def wrapped(f=None, **kwargs):
if f:
r = dec(f, **c_kwargs)
c_kwargs = {}
return r
else:
c_kwargs.update(kwargs) #<- UnboundLocalError: local variable 'c_kwargs' referenced before assignment
return wrapped
return wrapped
解决方案是替换c_kwargs = {}
为c_kwargs.clear()
如果有人想出一个更实际的例子,请随时编辑此帖子。
回答 7
另外,有时dict实例可能是dict的子类(defaultdict
例如)。在这种情况下,clear
首选使用using ,因为我们不必记住dict的确切类型,并且还避免重复代码(将清除行与初始化行耦合)。
x = defaultdict(list)
x[1].append(2)
...
x.clear() # instead of the longer x = defaultdict(list)
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。