2017-07-14 3 views
0

これはもっと興味深い質問です。 私はPythonリファレンス、ネストされたdictsと 'del'は予期しない動作を引き起こします

ph = {1:0, 2:0} 
d1 = {'a':ph, 'b':ph} 
d2 = {'a':{1:0,2:0},{'b':{1:0,2:0}} 
>>> d1 
{'a':{1:0,2:0},{'b':{1:0,2:0}} 

ので、D1およびD2(のpython 2.7.3 &でのpython 3.4.1を試してみました)、次の行動を観察し、これがなぜ起こるか/どのように知っていただきたいと思いは同じです。デルを使用するか、値を交換する際 しかし、これは予想通りD2ための動作である

>>> del d1['a'][1] 
>>> d1 
{'a':{2:0}, 'b':{2:0}} 
>>> del d2['a'][1] 
>>> d2 
{'a':{2:0},{'b':{1:0,2:0}} 

起こるが、D1(PH)にネストされた辞書は異なる動作をするように見えます。 これはPythonのすべての変数が実際に参照されるためですか? インスタンスごとにプレースホルダ辞書を指定できない場合は対処法がありますか?

ありがとうございました!あなたはd1から削除すると

+3

'd ['a']は最初の辞書のd ['b']'です。両方のキーに同じ辞書オブジェクトがあります。これは2番目のケースではそうではありません。 –

答えて

3

pythontutorを使用してみてください。あなたはそれにあなたのコードを置く場合は、これを表示されます。

enter image description here

あなたはd1で辞書を疑われるとは同じオブジェクト、phへの参照であることがわかります。

これは、あなたがdel d1['a'][1]それは本当にphにキーを削除するときので、あなたは、この得ることを意味しますと、あなたはコピーph辞書のd1を初期化する必要があるこの問題を回避するには

enter image description here

をここで他の答えで議論されている...

+0

@Moses Koledoye:編集をありがとう、申し訳ありません、私はそれを復元したので、誤ってそれを元に戻しました。 – Jimbo

+0

問題の人は、更新を見た。と素晴らしい数字BTW :) –

1

同じ参照へd1ポイントで両方のキーが、それはあなたがd1['a']d1['b']によってそれに達するかどうかphに影響を与えます - あなたは同じ場所に取得しています。

d2は、2つのオブジェクトをインスタンス化します。そのため、例の中の1つにのみ影響しています。

の2番目の参照で回避策が.deepcopy()になります。

d1 = {'a':ph, 'b':ph.deepcopy()} 

は( - コピー()で十分であろうが - あなたは本当にこの例ではdeepcopy必要はありませんが、phが、それ以上に複雑だった場合は、希望 - 上記のリンク先のドキュメントを参照してください。)

+1

.copy()/ .deepcopy()情報をありがとうございます。非常に役に立ちました – tailor

関連する問題