180

Pythonでは、辞書の呼び出しclear()と割り当てに違いはありますか? {}はいの場合、それは何ですか? 例:

d = {"stuff":"things"}
d.clear()   #this way
d = {}      #vs this way

4

8 に答える 8

303

同じ辞書を参照する別の変数がある場合、大きな違いがあります。

>>> d = {"stuff": "things"}
>>> d2 = d
>>> d = {}
>>> d2
{'stuff': 'things'}
>>> d = {"stuff": "things"}
>>> d2 = d
>>> d.clear()
>>> d2
{}

これは、割り当てd = {}によって新しい空の辞書が作成され、それがd変数に割り当てられるためです。これによりd2、アイテムがまだ残っている古い辞書が指し示されます。ただし、両方が指しd.clear()ている同じ辞書をクリアします。dd2

于 2008-12-15T22:30:29.463 に答える
32

d = {}の新しいインスタンスを作成しますdが、他のすべての参照は引き続き古いコンテンツを指します。 d.clear()内容はリセットされますが、同じインスタンスへのすべての参照は依然として正しいままです。

于 2008-12-15T22:32:02.907 に答える
22

他の回答で言及されている違いに加えて、速度の違いもあります。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
于 2008-12-16T11:31:10.790 に答える
8

すでに前に述べたことの例として:

>>> a = {1:2}
>>> id(a)
3073677212L
>>> a.clear()
>>> id(a)
3073677212L
>>> a = {}
>>> id(a)
3073675716L
于 2011-12-08T08:34:25.803 に答える
7

@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
于 2012-12-25T08:41:33.207 に答える