3

Python辞書でいくつかの異常な動作が見られます:

import numpy as np
td =[np.Inf, 2, 3]
a = {}
# First initialize contents of dictionary to a list of values
for k in range(10):
    a[k] = td

# now I want to access the contents to modify them based on certain criteria 
for k in range(10):
    c = a[k]
    c[0] = k
    a[k] = c

c[0] = kこれから、各ディクショナリキー値のリストの最初の各項目が( )に基づいて変更されることを期待しますが、最後に取得するのは、次のように、ディクショナリのすべての値が最後の値に更新されることですk

{0: [9, 2, 3], 1: [9, 2, 3], 2: [9, 2, 3], 3: [9, 2, 3], 
 4: [9, 2, 3], 5: [9, 2, 3], 6: [9, 2, 3], 7: [9, 2, 3], 
 8: [9, 2, 3], 9: [9, 2, 3]}

何かが足りないのですか、それとも辞書の定義に何か問題がありますか?

コードを実行するために別の方法でこれを回避することはできますが、辞書クラスがこのように動作する理由に興味があります。

4

3 に答える 3

9

各キーは同じリストを取得するため...リストの浅いコピーを作成するには、次の構文を使用します。

for k in range(10):
    a[k] = td[:] 

デモ:

>>> d = {}
>>> el = [1, 2, 3]
>>> d[0] = el
>>> d[1] = el
>>> map(id, d.values())
[28358416, 28358416]
于 2012-11-21T17:13:32.997 に答える
2

これは、値をに挿入するときにdict、まったく新しいリストを挿入していないために発生します。実際には、同じ古いリストへの参照を挿入しています。したがって、1つの値を変更すると、実際にはその値が指すリストが変更され、したがってすべての値が指すリストが変更されます。

値ごとに個別のリストが本当に必要な場合は、次のように挿入時にリストの浅いコピーを作成することをお勧めします。

td =[np.Inf, 2, 3]
for k in range(10):
    a[k] = td[:] #making a new list out of the old one

今、これはあなたが期待するように動作します

for k in range(10):
    c = a[k]
    c[0] = k
    a[k] = c

お役に立てれば

于 2012-11-21T17:15:30.860 に答える
0

td行で参照する場合a[k] = td、実際には元のリストへの参照を追加しています。そのリストの変更は、参照されている場所ならどこでも表示されます。新しいリストを作成する(またはループ自体で各エントリの新しいリストを作成する)には、コピーモジュールを使用する必要があります。

for k in range(10):
    a[k] = [np.Inf, 2, 3]
于 2012-11-21T17:14:21.207 に答える