今天coding的时候发现未知bug;
排查后发现是改变了reshape赋予对象带来的。
我印象中reshape复制前后两个对象是独立的,在内存里是两个不同的块,是自带深拷贝的(以前print过id看过); 但是结论是错的,reshape只是给了不同的view,id不同,.data不同,但是.ctypes.data(数据内存地址)是相同的,所以改变一个会相应改变另一个。
且看code:
>>> import numpy as np
>>> a = np.array([1,2,3])
>>> b = np.reshape(a,[3,1])
>>> a
array([1, 2, 3])
>>> b
array([[1],
[2],
[3]])
>>> b[0,0]=999
>>> b
array([[999],
[ 2],
[ 3]])
>>> a #改变b也会改变a
array([999, 2, 3])
>>> a.ctypes.data==b.ctypes.data
True
>>> a.data==b.data
False
>>> id(a)==id(b)