Pythonでは、辞書の呼び出しclear()
と割り当てに違いはありますか? {}
はいの場合、それは何ですか? 例:
d = {"stuff":"things"}
d.clear() #this way
d = {} #vs this way
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 = {} は 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
すでに前に述べたことの例として:
>>> 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