teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

質問の修正を受けて回答を変更

2020/07/23 09:44

投稿

hope_mucci
hope_mucci

スコア4447

answer CHANGED
@@ -1,1 +1,34 @@
1
+ ### まず前提
1
- `append`はその配列の末尾に引数のデータを追加します。
2
+ `append`はその配列の末尾に引数のデータを追加します。
3
+ input_listの末尾に追加されます。
4
+
5
+ ### arrとinput_listが同一になる理由
6
+
7
+ 結論から言うと、**arrとinput_listが同じオブジェクトを指している**からです。
8
+ pythonでは変数は全て「オブジェクトの参照」を指しています。
9
+ `arr = input_list`のコードは、arrにinput_listの参照を代入しているだけで、input_listの中身を複製してarrにセットしているわけではありません。
10
+
11
+ ```python
12
+ input_line=['A', 'Z', 'B', 'C']
13
+ arr=input_line
14
+ print('arr:',id(arr))
15
+ print('input_line:',id(input_line))
16
+ input_line.append('a')
17
+ print(arr)
18
+ print(input_line)
19
+ ```
20
+ を実行すると、arrとinput_lineのid(オブジェクト固有番号)が同一であることが確認できます。
21
+
22
+ ```python
23
+ input_line=['A', 'Z', 'B', 'C']
24
+ arr=input_line.copy() # <- arrにinput_line.copy()関数の結果を代入
25
+ print('arr:',id(arr))
26
+ print('input_line:',id(input_line))
27
+ input_line.append('a')
28
+ print(arr)
29
+ print(input_line)
30
+ ```
31
+
32
+ 上記のようなコードを実行すると、arrとinput_lineの中身は別々になります。
33
+ `input_line.copy()`は、リストの中身を新しいリストコピーし、その新しいidを返す関数です。
34
+ そのため、arrとinput_lineは別々のリストになります。