Path: csiph.com!aioe.org!.POSTED!not-for-mail From: Alain Ketterlin Newsgroups: fr.comp.lang.python Subject: Re: =?utf-8?Q?probl=C3=A8me?= de copie ? shallow - deep Date: Thu, 01 Feb 2018 18:34:36 +0100 Organization: =?utf-8?Q?Universit=C3=A9?= de Strasbourg Lines: 80 Message-ID: <871si4zk9f.fsf@universite-de-strasbourg.fr.invalid> References: <5a732113$0$3313$426a74cc@news.free.fr> NNTP-Posting-Host: qmYh1DWVgL6xVcQiZBZbmA.user.gioia.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Complaints-To: abuse@aioe.org User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) X-Notice: Filtered by postfilter v. 0.8.2 Cancel-Lock: sha1:sm0mr8dRxWmjfzu00P0cZyu3C/U= Xref: csiph.com fr.comp.lang.python:3055 Fabrice writes: > je n'ai toujours pas compris on dirait ;-) > Voici le code qui marche et qui simule le reflet d'une image dans l'eau: > > import matplotlib.pyplot as mpl # mpl sera notre rep=C3=A8re > import numpy as np # np manipule des tableaux > import copy > > originale =3D mpl.imread("damier.jpeg") # un image est lue > image =3D copy.copy(originale) # image est une copie modifiable > hauteur =3D len(image) # hauteur contient le nombre de ligne > largeur =3D len(image[0]) # largeur contient le nombre de pixel > > for ligne in range(hauteur//2): > tmp =3D copy.copy(image[ligne]) > image[ligne] =3D image[hauteur-ligne-1] > image[hauteur-ligne-1] =3D tmp > > print("L'originale") > mpl.imshow(originale,cmap=3D'gray') # On affiche l'image dans le rep=C3= =A8re > mpl.show() # On affiche le rep=C3=A8re =C3=A0 l'= =C3=A9cran > print("et son reflet dans l'eau") > mpl.imshow(image,cmap=3D'gray') # On affiche l'image dans le rep=C3= =A8re > mpl.show() > > > mais si je ne fais pas copy.copy, je perds la liste dans tmp. En fait, il ne faut pas consid=C3=A9rer les np.array (ou image) comme des listes Python. Ce sont des structures diff=C3=A9rents, m=C3=AAme si la synt= axe est similaire. Si j'ai bien compris (mais marc.marc pourra confirmer -- ou pas), quand tu =C3=A9cris : tmp =3D image[ligne] tu r=C3=A9cup=C3=A8res une "view" sur l'image originale. Ce n'est pas une s= imple r=C3=A9f=C3=A9rence, et de toute fa=C3=A7on image[ligne] n'existe pas ind= =C3=A9pendamment du reste l'image (les np.array sont "denses", alors que les listes de listes sont "creuses", ou =C3=A9clat=C3=A9es). Donc : 1) les lignes n'existent pas individuellement, 2) tmp et image[ligne] sont effectivement la m=C3=AAme chose, et donc 3) image[ligne]=3D... modifie effectivement aussi bien l'image que tmp. (Je m'arr=C3=AAte l=C3=A0, parce que je ne peux pas essayer en ce moment...) > Pourtant, tmp et image[ligne] sont des =C3=A9tiquettes qui pointent sur la > m=C3=AAme liste. > Quand je fais image[ligne] =3D image[hauteur-ligne-1], je d=C3=A9tache > l'=C3=A9tiquette image[ligne] de la liste dans tmp pour la coller sur la > liste image[hauteur-ligne-1]. l'=C3=A9tiquette tmp devrait pointer sur la > liste en m=C3=A9moire qui ne doit ^pas =C3=AAtre effac=C3=A9e puisque r= =C3=A9f=C3=A9renc=C3=A9e. > Puis je d=C3=A9tache l'=C3=A9tiquette image[hauteur-ligne-1] de la liste = dans > image[ligne] maintenant pour l'attacher =C3=A0 la liste dans tmp. > > En C++, j'aurai dit que j'ai =C3=A9chang=C3=A9 les pointeurs. Un objet mu= table, > c'est bien un pointeur ? Ton analyse s'applique bien aux listes python d'origine. Mais numpy c'est une tout autre bestiole... C'est fait pour faire du calcul scientifique, donc dans des matrices denses, comme on fait dans les langages raisonnablement efficaces pour =C3=A7a (Fortran, C and co). Numpy, c'est le renard (C/Fortran/...) qui entre dans le poulailler (celui qui est plein de canards). -- Alain.