在列表中,b=a[:]
和b=a.copy()
是具有相同效果的,都可以用来deep copy,但是在numpy 数组中两者效果却不同,b=a[:]
复制后b仍然随着a的改变而改变,但是两者指向的内存地址却不同,b is a
也返回false
,这是为什么呢?谢谢!
>>>import numpy as np
>>>a=np.arange(4)
>>>b=a
>>>c=a[:]
>>>d=a.copy()
>>>a[3]=10
>>>id(a)
140572616448320
>>>id(b)
140572616448320 # a,b的指针地址相同
>>>id(c)
140572616446080
>>>id(d)
140572616448640
>>>a
array([ 0, 1, 2, 10])
>>>b
array([ 0, 1, 2, 10])
>>>c
array([ 0, 1, 2, 10]) # a,c的指针地址不同,变化却是一致的
>>>d
array([0, 1, 2, 3])
numpy
关于copy
有三种情况,完全不复制、视图(view
)或者叫浅复制(shadow copy
)和深复制(deep copy
)。而
b = a[:]
就属于第二种,即视图,这本质上是一种切片操作(slicing
),所有的切片操作返回的都是视图。具体来说,b = a[:]
会创建一个新的对象b
(所以说 id 和a
不一样),但是b
的数据完全来自于a
,和a
保持完全一致,换句话说,b
的数据完全由a
保管,他们两个的数据变化是一致的,可以看下面的示例:b = a
和b = a[:]
的差别就在于后者会创建新的对象,前者不会。两种方式都会导致a
和b
的数据相互影响。要想不让
a
的改动影响到b
,可以使用深复制: