質問: ### 前提・実現したいこと なぜarrの値が['A', 'Z', 'B', 'C', 'a']になるのかを知りたい。 ### 発生している問題・エラーメッセージ ### 該当のソースコード ``` input_line=['A', 'Z', 'B', 'C'] arr=input_line input_line.append('a') print(arr) print(input_line) ``` ### 試したこと googleで調べた。 ### 補足情報(FW/ツールのバージョンなど) python3
回答: ### まず前提 `append`はその配列の末尾に引数のデータを追加します。 input_listの末尾に追加されます。 ### arrとinput_listが同一になる理由 結論から言うと、**arrとinput_listが同じオブジェクトを指している**からです。 pythonでは変数は全て「オブジェクトの参照」を指しています。 `arr = input_list`のコードは、arrにinput_listの参照を代入しているだけで、input_listの中身を複製してarrにセットしているわけではありません。 ``` input_line=['A', 'Z', 'B', 'C'] arr=input_line print('arr:',id(arr)) print('input_line:',id(input_line)) input_line.append('a') print(arr) print(input_line) ``` を実行すると、arrとinput_lineのid(オブジェクト固有番号)が同一であることが確認できます。 ``` input_line=['A', 'Z', 'B', 'C'] arr=input_line.copy() # <- arrにinput_line.copy()関数の結果を代入 print('arr:',id(arr)) print('input_line:',id(input_line)) input_line.append('a') print(arr) print(input_line) ``` 上記のようなコードを実行すると、arrとinput_lineの中身は別々になります。 `input_line.copy()`は、リストの中身を新しいリストコピーし、その新しいidを返す関数です。 そのため、arrとinput_lineは別々のリストになります。