前提
環境:VSCode、Python3.8.3
下記のソースコードで、変数 data2 には変数 newData の初期値を持っていてほしいのですが、**append() **で newData を変更した段階で data2 も同じ値を持ってしまいます。
python
1newData = dict() 2 3newData = [ 4 { 5 "title": [ 6 { 7 "text": "aaa", 8 "type": "Noun", 9 "property": "TenseNoun" 10 } 11 ], 12 "synopsis": [ 13 { 14 "text": "bbb", 15 "type": "Noun", 16 "property": "ConcreteNoun" 17 } 18 ] 19 } 20] 21 22data2 = newData.copy() 23 24addTitle = dict() 25addTitle = { 26 "text": "test", 27 "type": "titleType", 28 "property": "propertyType" 29} 30 31newData[0]["title"].append(addTitle) 32 33print(newData) 34print(data2) 35print(id(newData)) 36print(id(data2)) 37 38#実行結果 39#[{'title': [{'text': 'aaa', 'type': 'Noun', 'property': 'TenseNoun'}, {'text': 'test', 'type': 'titleType', 'property': 'propertyType'}], 'synopsis': [{'text': 'bbb', 'type': 'Noun', 'property': 'ConcreteNoun'}]}] 40#[{'title': [{'text': 'aaa', 'type': 'Noun', 'property': 'TenseNoun'}, {'text': 'test', 'type': 'titleType', 'property': 'propertyType'}], 'synopsis': [{'text': 'bbb', 'type': 'Noun', 'property': 'ConcreteNoun'}]}] 41#2086704527040 42#2086704526976
このように copy() を用いてidの違う変数になっているにも関わらず、同じ値を持ってしまいます。
また、以下のように newData 全体に対して append() する場合は data2 の値が期待通りになってくれます
python
1newData = dict() 2 3newData = [ 4 { 5 "title": [ 6 { 7 "text": "aaa", 8 "type": "Noun", 9 "property": "TenseNoun" 10 } 11 ], 12 "synopsis": [ 13 { 14 "text": "bbb", 15 "type": "Noun", 16 "property": "ConcreteNoun" 17 } 18 ] 19 } 20] 21 22data2 = newData.copy() 23 24addTitle = dict() 25addTitle = { 26 "title": [ 27 { 28 "text": "testA", 29 "type": "Noun", 30 "property": "TenseNoun" 31 } 32 ], 33 "synopsis": [ 34 { 35 "text": "testB", 36 "type": "Noun", 37 "property": "ConcreteNoun" 38 } 39 ] 40 } 41 42newData.append(addTitle) 43 44print(newData) 45print(data2) 46print(id(newData)) 47print(id(data2)) 48 49#実行結果 50#[{'title': [{'text': 'aaa', 'type': 'Noun', 'property': 'TenseNoun'}], 'synopsis': [{'text': 'bbb', 'type': 'Noun', 'property': 'ConcreteNoun'}]}, {'title': [{'text': 'testA', 'type': 'Noun', 'property': 'TenseNoun'}], 'synopsis': [{'text': 'testB', 'type': 'Noun', 'property': 'ConcreteNoun'}]}] 51#[{'title': [{'text': 'aaa', 'type': 'Noun', 'property': 'TenseNoun'}], 'synopsis': [{'text': 'bbb', 'type': 'Noun', 'property': 'ConcreteNoun'}]}] 52#2420668184768 53#2420668184704
なぜこのように2つのソースの実行結果に差異ができてしまうのでしょうか
また、1つ目のソースの実行で newData と data2 の値が同じにならないようにするにはどうすれば良いのでしょうか
回答よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/07/28 07:16