python:リストに辞書を追加する-動作のようなポインタが表示されます


88

私はPythonインタープリターで次のことを試しました:

>>>
>>> a = []
>>> b = {1:'one'}
>>> a.append(b)
>>> a
[{1: 'one'}]
>>> b[1] = 'ONE'
>>> a
[{1: 'ONE'}]
>>>

ここでは、辞書「b」をリスト「a」に追加した後、辞書「a」のキー1に対応する値を変更しています。どういうわけか、この変更はリストにも反映されます。辞書をリストに追加するとき、辞書の値を追加するだけではありませんか?辞書へのポインタをリストに追加したように見えるため、辞書への変更がリストにも反映されています。

変更がリストに反映されないようにします。どうすればいいのですか?

お時間をいただきありがとうございます!


チェーホフそれは辞書 'b'ではなく、辞書bまたは名前 'b'の辞書のいずれかです。ちなみに、あなたは間違って書いた:「辞書 'a'のキー1に対応する値を変更している」いいえ、辞書b。驚いたことに、リストには値が含まれていません。すべてがPythonのオブジェクトであるため、リストにはオブジェクトが含まれています。より正確には、リストはオブジェクトへの参照を保持します。
eyquem 2011年

Chekhovこの質問も表示されるはずです:(stackoverflow.com/questions/5242933/…
eyquem 2011年

@eyquemコメントありがとうございます。急いで投稿していました。謝罪いたします。
neo29 2011年

チェーホフそれは非難ではなく、単なる情報でした。ちなみに、私の答えがやや役に立ったら、賛成することができます。また、回答の中から1つの回答を「受け入れる」ことを選択できます。1つの回答の左側にあるポイントカウンターの下にある山形のストライプをクリックすると、25ポイントが獲得されます。または、質問を受け入れないことを選択できます。
eyquem 2011年

回答:


145

リストに元の辞書への参照が含まれているという点で正しいです。

a.append(b.copy()) トリックを行う必要があります。

これは浅いコピーになることに注意してください。別の方法はcopy.deepcopy(b)、ディープコピーを作成するを使用することです。


6
驚くばかり!私はこれで長い間ブロックされました
Yasin 2016年

2
これは私があきらめてスタックをチェックすることに決めるまで約30分の間私の心を吹き飛ばしていました。
FlyingZebra1

35

また、とのdict

a = []
b = {1:'one'}

a.append(dict(b))
print a
b[1]='iuqsdgf'
print a

結果

[{1: 'one'}]
[{1: 'one'}]

copy()ほど高速かどうかはわかりませんが、deepcopy()よりも高速のようです。複雑な辞書スキーマでは、dict()が新しい辞書を作成するため、deepcopy()に近くなる可能性があります。
selotec 2016年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.