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

回答編集履歴

1

d

2019/12/21 16:38

投稿

tiitoi
tiitoi

スコア21962

answer CHANGED
@@ -24,4 +24,36 @@
24
24
 
25
25
  b[1] = -1 # b を変更すると a も変わる
26
26
  print(a) # [ 1 -1 3]
27
- ```
27
+ ```
28
+
29
+ ## 追記
30
+
31
+ b = a[スライス] とした場合、b と a は異なるオブジェクトになります。
32
+ ただし、numpy の場合は、view という機能で異なるオブジェクトでも内部のデータは共有するということをやっています。
33
+ そのため、b = a[:] とした場合でも b は a の view になるので、オブジェクトとしては a と b は異なりますが、内部データは共有しています。
34
+ このことは次のようにして確かめられます。
35
+
36
+ ```
37
+ a = np.array([1, 2, 3])
38
+ b = a[:] # b は a とは違うオブジェクト、だけど内部データは共有している
39
+
40
+ b[1] = 100
41
+
42
+ # b を変えたら a も変わっている
43
+ print(a) # [ 1 100 3]
44
+ ```
45
+
46
+ view というのは numpy の機能であり、Python の言語に備わった機能ではありません。
47
+ Python のリストの場合、スライスすると a と b は異なるオブジェクトで numpy の view のように内部データを共有するような機能もないので、コピー (deep copy) になります。
48
+
49
+ ```
50
+ a = [1, 2, 3]
51
+ b = a[:]
52
+
53
+ b[1] = 100
54
+
55
+ # b と a は違うオブジェクトなので、a は変わっていない
56
+ print(a) # [1, 2, 3]
57
+ ```
58
+
59
+ [Pythonのcopyとdeepcopyについて - Qiita](https://qiita.com/Kaz_K/items/a3d619b9e670e689b6db)