Comme nous l'avons déjà souligné, b += 1
mises à jour b
en place, tandis que a = a + 1
calcule a + 1
et attribue ensuite le nom a
au résultat (maintenant a
ne fait pas référence à une ligne de A
plus).
Pour comprendre la +=
Cependant, pour être un bon opérateur, il faut aussi comprendre la notion de mutable par rapport à immuable objets. Voyons ce qui se passe si nous laissons de côté l'élément .reshape
:
C = np.arange(12)
for c in C:
c += 1
print(C) # [ 0 1 2 3 4 5 6 7 8 9 10 11]
Nous constatons que C
es pas mis à jour, ce qui signifie que c += 1
y c = c + 1
sont équivalents. Cela s'explique par le fait que maintenant C
est un tableau 1D ( C.ndim == 1
), et donc lorsque l'on itère sur C
chaque élément entier est extrait et assigné à c
.
En Python, les entiers sont immuables, ce qui signifie que les mises à jour sur place ne sont pas autorisées. c += 1
en c = c + 1
donde c
se réfère désormais à un nouveau entier, non couplé à C
de quelque manière que ce soit. Lorsque vous passez en boucle sur les tableaux remodelés, des lignes entières ( np.ndarray
) sont attribués aux b
(et a
) à la fois, qui sont mutable ce qui signifie que vous êtes autorisé à insérer de nouveaux entiers à votre guise, ce qui se produit lorsque vous utilisez des objets a += 1
.
Il convient de mentionner que, bien que les +
y +=
sont censés être liés comme décrit ci-dessus (et le sont très généralement), chaque type peut les mettre en œuvre comme il le souhaite en définissant le paramètre __add__
y __iadd__
respectivement.