Path: ...!weretis.net!feeder8.news.weretis.net!news.mixmin.net!aioe.org!K7PIs9tCGQ+WHJa7e6BylQ.user.46.165.242.75.POSTED!not-for-mail From: Alain Ketterlin Newsgroups: fr.comp.lang.python Subject: Re: del Date: Mon, 12 Sep 2022 21:22:03 +0200 Organization: =?utf-8?Q?Universit=C3=A9?= de Strasbourg Message-ID: <87r10g9z50.fsf@universite-de-strasbourg.fr.invalid> References: <631f7757$0$5124$426a74cc@news.free.fr> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Injection-Info: gioia.aioe.org; logging-data="59819"; posting-host="K7PIs9tCGQ+WHJa7e6BylQ.user.gioia.aioe.org"; mail-complaints-to="abuse@aioe.org"; User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux) X-Notice: Filtered by postfilter v. 0.9.2 Cancel-Lock: sha1:oWoz4gHoyyK72OG3u5FykgPy5zI= Bytes: 3113 Lines: 65 ast writes: >>>> lst =3D [0, 1, 2] >>>> del lst[:] >>>> lst > [] > > normalement lst[:] est une copie de lst, donc > d=C3=A9truire lst[:] ne devrait pas modifier lst, > or si, lst a =C3=A9t=C3=A9 vid=C3=A9e. Pourquoi ? Non, ce n'est pas une copie. La doc de "del" dit : | Deletion of a name removes the binding of that name [...] |=20 | Deletion of attribute references, subscriptions and slicings is passed | to the primary object involved |...] (https://docs.python.org/3/reference/simple_stmts.html#grammar-token-python= -grammar-del_stmt) Donc l'instruction "del" est juste une syntaxe sp=C3=A9ciale. Dans ton cas : del lst[:] revient =C3=A0 appeler quelque chose comme : lst.__delitem__ (slice (None, None, None)) En bref : del est une instruction, elle ne fait pas une =C3=A9valuation com= me le ferait un appel de fonction ; ce qui suit "del" n'est pas une expression (tu ne peux pas =C3=A9crire "del x+y"), mais une "target", c'est de la m=C3=AAme nature que ce que tu peux mettre =C3=A0 gauche de "=3D" pour l'affectation. (https://docs.python.org/3/reference/simple_stmts.html#grammar-token-python= -grammar-target) (Pour ceux qui connaissant un peu de compilation, on appelle cela une "lvalue" en g=C3=A9n=C3=A9ral. J'imagine que quelqu'un a cru inventer quelq= ue chose et a choisi un autre nom pour une notion en fait archi-connue.) >>>> lst =3D [0, 1, 2] >>>> lst2 =3D lst[:] >>>> del lst2 >>>> lst > [0, 1, 2] > > l=C3=A0 c'est OK. Tout ce que j'ai fait est de donner > un nom =C3=A0 lst[:] En fait, tu cr=C3=A9es (avec "lst[:]") un nouvel objet liste qui est une copie de "lst", que tu lies au nom "lst2". Ensuite, tu supprimes le nom "lst2" (et donc ici aussi la copie de liste que tu viens de cr=C3=A9er). La diff=C3=A9rence ici c'est que "lst[:]" est une expression, parce qu'elle est =C3=A0 droite de "=3D". Puisque c'est une expression, sa valeur est calcul=C3=A9e. Donc il y a copie de la liste. (Techniquement, ici "lst[:]" est une "rvalue" -- "r" signifie "right" comme "l" signifiait "left" plus haut, des positions par rapport au symbole d'affectation.) -- Alain.