在列表中,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
Il existe trois situations concernantcopy
, aucune copie du tout , vue (view
) ou copie superficielle (shadow copy
) et Copie profonde (deep copy
).et
. La différence entreb = a[:]
appartiennent au deuxième type, c'est-à-dire la vue, qui est essentiellement une opération de découpage (slicing
), et toutes les opérations de découpage renvoient des vues. Plus précisément,b = a[:]
créera un nouvel objetb
(donc l'identifiant est différent dea
), mais les données deb
proviennent entièrement dea
et restent complètement cohérentes aveca
Change In other. En d'autres termes, les données deb
sont entièrement conservées para
, et les modifications de données des deux sont cohérentes. Vous pouvez voir l'exemple suivant :b = a
etb = a[:]
est que ce dernier créera un nouvel objet, mais pas le premier. Les deux méthodes feront interagir les données dea
etb
les unes avec les autres.Pour éviter que les modifications de
a
n'affectentb
, vous pouvez utiliser la copie complète :