回答:
同じ辞書を参照する別の変数がある場合、大きな違いがあります。
>>> 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 = {}は2倍の速さです。
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
d = {}
全体のクリーンアップは後でガベージコレクターに任せることができるため、設定はより速くなるはずです。
@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}
辞書を再割り当てすると、新しいオブジェクトが作成され、元のオブジェクトは変更されません。
言及されていないことの1つはスコープの問題です。良い例ではありませんが、ここで私が問題に遭遇した場合です:
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()
誰かがより実用的な例を考えている場合は、この投稿を自由に編集してください。
global c_kwargs
おそらくまた機能しませんか?たぶんglobal
、多くを使用するのが最善ではありません。
global
すると、関数の動作が異なります。conf_decoratorへのすべての呼び出しは、同じc_kwargs変数を共有します。Python 3がnonlocal
この問題に対処するためのキーワードを追加したと思います。