view でも中のデータを共有しているというだけで、オブジェクトとしては別物なので、id() の値の比較では、判定できません。
b
が a
の view かどうかは base
attribute を見ればわかります。
python
1import numpy as np
2
3a = np.array([1, 2, 3])
4b = a[::-1]
5
6print(id(a) == id(b)) # False
7print(b.base is a) # True
: の場合は view になっています。
python
1import numpy as np
2
3a = np.array([1, 2, 3])
4b = a[:]
5
6print(id(a) == id(b)) # False
7print(b.base is a) # True
8
9b[1] = -1 # b を変更すると a も変わる
10print(a) # [ 1 -1 3]
追記
b = a[スライス] とした場合、b と a は異なるオブジェクトになります。
ただし、numpy の場合は、view という機能で異なるオブジェクトでも内部のデータは共有するということをやっています。
そのため、b = a[:] とした場合でも b は a の view になるので、オブジェクトとしては a と b は異なりますが、内部データは共有しています。
このことは次のようにして確かめられます。
a = np.array([1, 2, 3])
b = a[:] # b は a とは違うオブジェクト、だけど内部データは共有している
b[1] = 100
# b を変えたら a も変わっている
print(a) # [ 1 100 3]
view というのは numpy の機能であり、Python の言語に備わった機能ではありません。
Python のリストの場合、スライスすると a と b は異なるオブジェクトで numpy の view のように内部データを共有するような機能もないので、コピー (deep copy) になります。
a = [1, 2, 3]
b = a[:]
b[1] = 100
# b と a は違うオブジェクトなので、a は変わっていない
print(a) # [1, 2, 3]
Pythonのcopyとdeepcopyについて - Qiita