在列表中,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
에 영향을 미치지 않도록 하려면 전체 복사를 사용할 수 있습니다.