2017-10-12 14 views
-1

私は私が辞書に浅いコピー操作を実装しようとしていた中でPythonコードの下の部分を持っている:浅いコピーが

のようなネストされたデータ構造がある場合、私の理解あたりとして今
d = {'name':'Subhayan','age':32,'friends':['papa','mama']} 
new_d = d.copy() 
new_d['friends'] = [] 

print (d) 
print (new_d) 

私の場合、浅いコピーのリストは機能しません。 new_d dictの変更もd-dictに影響します。

私の理解が正しいかどうか誰かに教えてもらえますか?

このスクリプトを実行した後の回答は、何か違うものです。

{'name': 'Subhayan', 'age': 32, 'friends': ['papa', 'mama']} 
{'name': 'Subhayan', 'age': 32, 'friends': []} 

これは明らかにディープコピーです。

どこが間違っていますか?

+0

はい、参照はd.copy()の一部として「ディープコピー」されません。 コピーしたい場合は、copy.deepcopy(d)を使用する必要があります。 "空の"参照が必要な場合は、独自のコピー機能を実装する必要があります。 – Aviad

+0

割り当てを実行して新しいオブジェクトを名前にバインドする方法と、名前に結びついている既存のオブジェクトの突然変異。 'new_d ['friends'] [:] = []'この突然変異を行うとどうなるか見てみましょう。 –

答えて

1

書かれたコードはエイリアスの問題にはなりません。ただし、の値をに変更すると、その変更が両方のディクショナリに表示されます。

d = {'name':'Subhayan','age':32,'friends':['papa','mama']} 
new_d = d.copy() 
new_d['friends'][0] = 'new value' 

print (d) 
print (new_d) 

# returns: 
{'age': 32, 'name': 'Subhayan', 'friends': ['new value', 'mama']} 
{'age': 32, 'name': 'Subhayan', 'friends': ['new value', 'mama']} 
0

新しい辞書が変更されたときに、辞書内のオブジェクトを変更したい場合は、まったくcopyまたはdeepcopyを使用しないでください。

ちょうどDにnew_dを割り当てる:浅いコピーは、元に見つかったオブジェクトにその中に参照を挿入する(可能な限り)、新しい複合オブジェクトを作成し、 :

1
d = {'name':'Subhayan','age':32,'friends':['papa','mama']} 
new_d = d 
new_d['friends'] = [] 

assert d['friends'] == [] 

https://docs.python.org/2/library/copy.html

  • 新規化合物は、原稿に見出さオブジェクトがそう参照は「ママ」や「パパ」
への参照である「ママ」や「パパ」
  • ある
  • new_dあります

    参照オブジェクトの内容を変更せず、オブジェクト(リスト)自体を変更しました。

    関連する問題