深拷贝、浅拷贝、视图
一、基本概念
深拷贝:通过“深拷贝”得到的变量互不干扰,其中一个变量的值改变时,不影响其他变量的值。
浅拷贝:共享内存地址的两个变量,当其中一个变量的值改变时,另一个变量的值也随之改变。此时,变量间的“拷贝” 是“浅拷贝”。
也可以理解为把存放变量的地址值传给被赋值的变量,不同的数组对象分享同一个数据,两个变量共享同一个地址
视图:view ()操作在不对某一个数组进行复制的情况下创建一个同样指向该数据的视图,是一个新的对象,会和原来的数组共享数据,不是同一个地址。
二、代码运行
存取元素中的“浅拷贝”与“深拷贝”
使用整数序列
当使用整数序列对数组元素进行存取时,将整数序列中的每个元素作为下标,整数序列可以是列表或者数组。使用整数序列作为下标获得的数组不和原始数组共享数据空间。
当使用布尔数组b作为下标存取数组x中的元素时,将收集数 组x中所有在数组b中对应下标为True的元素。使用布尔数组作为下标获得的数组不和原始数组共享数据空间,注意这种方式只对应于布尔数组,不能使用布尔列表。
三、总结
浅拷贝是对另外一个变量的内存地址的拷贝,这两个变量指向同一个内存地址的变量值。
注:仅仅拷贝的是目标变量的所在地址,目标变量的所在地址不发生任何变化。
公用一个值;
这两个变量的内存地址一样;
对其中一个变量的值改变,另外一个变量的值也会改变;
深拷贝:一个变量对另外一个变量的值拷贝。
注:拷贝的是目标变量的值,是真实的拷贝,新的变量产生了新的内存地址。
变量的内存地址不同;
变量各有自己的值,且互不影响;
对其任意一个变量的值的改变不会影响其余变量的值;
view相当于传引用,view和原始数据共享一份数据,修改一个会影响另一个。
slice,array.view(dtype)可以产生view,但array.astype(dtype)产生的不是view