numpy数组两种表示形式的view方法内存ID差异原因解析
解析Numpy数组原对象与切片视图的view方法内存ID差异
这事儿得从Numpy数组切片的本质说起,咱们一步步拆解:
核心本质:切片返回的是新的ndarray实例(共享数据但对象独立)
- 变量
a是一个实打实的numpy.ndarray实例,它在内存里占据了一块属于自己的对象空间,对应输出里的0x10ef5e3f0。 - 当你执行
a[:]时,Numpy会返回原数组的视图,但注意:这个视图是一个全新的ndarray对象!它和原数组a共享底层的数据缓冲区(所以修改a[:]的值会影响a),但这个视图对象本身在内存里是独立的,有自己的专属对象ID,也就是输出里的0x10e8936f0。
为什么view方法的内存ID不同?
你打印的a.view和a[:].view,本质是绑定到不同ndarray实例上的方法对象:
a.view是绑定到原数组a这个实例的view方法,它的内存地址和a的实例ID强相关;a[:].view是绑定到a[:]这个新切片视图实例的view方法,它的内存地址关联的是切片视图的实例ID。
因为这两个方法绑定的是完全不同的ndarray实例,所以它们的内存ID自然不一样。
小验证:直接打印实例ID就能确认
你可以试试运行这两行代码:
print(id(a)) print(id(a[:]))
输出的结果会正好对应你之前看到的那两个内存地址——这就实锤了:a和a[:]是两个不同的对象,它们的绑定方法自然也不在同一块内存里。
内容的提问来源于stack exchange,提问作者kichinosukey
相关产品推荐
相关产品推荐

