关于“深拷贝和浅拷贝”的官方定义:
The difference between shallow and deep copying is only relevant for compound objects (objects that contain other objects, like lists or
class instances).
A shallow copy constructs a new compound object and then (to the
extent possible) inserts the same objects into it that the
original contains.
A deep copy constructs a new compound object and then, recursively,inserts copies into it of the objects found in the original.
翻译:
浅和深拷贝的区别仅仅是相关的复合对象(包含其他对象的对象,比如列表或类实例)。
浅拷贝构造一个对象,然后(新的化合物尽可能)将相同的对象插入它最初的包含。
深拷贝构造一个新的复合对象,然后递归地,将副本插入它在最初发现的对象。
1、浅拷贝
浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。
浅拷贝会创建新对象,其内容非原对象本身的引用,而是原对象内第一层对象的引用。(拷贝组合对象,不拷贝子对象)
常见的浅拷贝有:切片操作、工厂函数、对象的copy()方法、copy模块中的copy函数。
共享地址的两个变量,当其中一个变量的值改变时,另一个变量的值也随之改变。此时,变量间的“拷贝”是“浅拷贝”。
浅拷贝——ndarray.view()
共享“视图”(view)的两个变量,当其中一个变量的值改变时,另一个变量的值也随之改变。此时,变量间的“拷贝”也是“浅拷贝”。
2、深拷贝
深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,它的时间和空间开销要高,新对象和原对象没有任何关联。
深拷贝——np.copy()
通过“深拷贝”得到的变量互不干扰,其中一个变量的值改变时,不影响其他变量的值。
3、存取元素中的“浅拷贝”与“深拷贝”
当使用整数序列对数组元素进行存取时,将整数序列中的每个元素作为下标,整数序列可以是列表或者数组。使用整数序列作为下标获得的数组不和原始数组共享数据空间
当使用布尔数组b作为下标存取数组x中的元素时,将收集数组x中所有在数组b中对应下标为True的元素。使用布尔数组作为下标获得的数组不和原始数组共享数据空间,注意这种方式只对应于布尔数组,不能使用布尔列表。
4、视图
视图是数据的一个别称或引用,通过该别称或引用亦便可访问、操作原有数据,但原有数据不会产生拷贝。如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置。
视图一般发生在:
1、numpy 的切片操作返回原数据的视图。
2、调用 ndarray 的 view() 函数产生一个视图。
ndarray.view()
ndarray.view()会创建一个新的数组对象,该方法创建的新数组的维数更改不会更改原始数据的维数。
使用切片创建视图修改数据会影响到原始数组
ndarray.copy()
ndarray.copy()函数创建一个副本。 对副本数据进行修改,不会影响到原始数据,它们物理内存不在同一位置。