En Python, l'affectation est l'association d'une étiquette à un objet pré-existant. Si a
et b
sont deux identificateurs, après l'affectation :
a = b
a
et b
référencent le même objet. Donc si cet objet est modifiable, une modification ultérieure via b
affecte aussi a
:
b = [0, 1, 2]
a = b
b.append(3)
print("a =", a)
a = [0, 1, 2, 3]
En Fortran, les concepts sont différents. Une variable représente une case mémoire (ou un ensemble de cases). L'affectation remplit cette case avec une valeur. Les cas où deux variables dans un même scope peuvent partager le même espace mémoire sont très restreints (pointer
; equivalence
et common
qui sont obsolètes). En dehors de ces cas, non seulement l'affectation :
a = b
est une copie mais aucune modification ultérieure de b
ne peut affecter a
.
Revenant à Python, en notant c
une expression quelconque, dans la séquence :
a = b
b = c
il est absolument impossible que la deuxième affectation (à elle toute seule) modifie a
, quel que soit le type de l'objet initialement référencé par b
, quel que soit le type de c
. Par contre, il est possible qu'une opération ultérieure sur b
modifie a
si l'objet initialement référencé par b
est lié à c
.
import numpy as np
b = np.array([0,1,2])
c = b[1:]
print(c)
[1 2]
L'opération basic slicing d'un tableau numpy crée une vue de ce tableau et non une copie. b
et c
référencent donc des objets liés.
a = b
b = c
La seconde affectation n'a pas modifié a
:
print(a)
[0 1 2]
Par contre, si on modifie maintenant b
, a
est impacté :
b[0]=19
print("b =", b)
print("a =", a)
b = [19 2] a = [ 0 19 2]
x, y = 0,1
a = (x,y)
x,y =2,3
print(a)
(0, 1)
b = (x,y)
a = b
b = 9
print(a)
(2, 3)