Vol. 2 — № 05
The Python Loop · KiosqueNewsstand
Blog  
Un atelier Python · Édition d'ApprentissageA Python Workshop · Learning Edition

copy contre deepcopy : ce qu'une copie copie vraiment copy versus deepcopy: what a copy actually copies

« Copie d'abord » est la parade à l'aliasing — encore faut-il savoir ce qu'on duplique. list(x), x[:], dict(x) clonent le contenant mais partagent encore les éléments : la copie de surface. copy.deepcopy descend récursivement et isole tout, à un prix — et souvent pour rien. Entre les deux, la juste dose se choisit, elle ne se subit pas. 'Copy first' is the counter to aliasing — provided you know what you're duplicating. list(x), x[:], dict(x) clone the container but still share the elements: the shallow copy. copy.deepcopy descends recursively and isolates everything, at a price — often for nothing. Between the two, the right dose is chosen, not suffered.

AudienceAudience
Dev qui a vu l'aliasing et cherche à isoler ses données proprement Dev who has seen aliasing and wants to isolate data cleanly
Format
Self-paced
ChapitresChapters
5
Date
Juil 2026 Jul 2026
≈ 18 min ●●○○ CopiesAliasingdeepcopy

Chapitre 1 en accès libre — la suite (ch. 2 à 5) est réservée. Chapter 1 free to read — the rest (ch. 2–5) is members-only.

01CadrageFraming3 min

Une copie a deux niveaux. Presque tous n'en clonent qu'un.A copy has two levels. Almost all of them clone only one.

Au numéro précédent, la parade à l'aliasing était « copie avant de muter ». Bonne règle — mais elle rouvre aussitôt une question qu'on croyait réglée : quand tu écris list(grille), qu'est-ce qui est copié, au juste ? Le contenant, oui : tu obtiens une nouvelle liste, indépendante à son niveau. Mais ses éléments — ici les sous-listes — ne sont pas clonés : la copie pointe les mêmes objets internes que l'original. Copier n'est pas un geste atomique. C'est une profondeur, et par défaut cette profondeur vaut un.In the previous issue, the counter to aliasing was 'copy before you mutate'. Good rule — but it reopens a question we thought settled: when you write list(grille), what exactly gets copied? The container, yes: you get a new list, independent at its level. But its elements — here the sub-lists — aren't cloned: the copy points at the same inner objects as the original. Copying isn't an atomic act. It's a depth, and by default that depth is one.

La copie qui ne protège pas l'intérieurThe copy that doesn't protect the inside
grille = [[1, 2], [3, 4]]
copie = list(grille)      # « je copie la grille » — un nouveau contenant
copie[0].append(99)       # je ne touche « que » la copie
print(grille)             # [[1, 2, 99], [3, 4]] — l'original a changé aussi
Deux niveaux, une seule frontière clonéeTwo levels, only one boundary cloned
grille
copie
contenants distinctsdistinct containers
[1, 2] ← partagé
[3, 4] ← partagé

grille et copie sont deux listes différentes — mais elles pointent les mêmes sous-listes. Muter une sous-liste par l'une se voit par l'autre. La copie a dédoublé le premier étage, pas le second.grille and copie are two different lists — but they point at the same sub-lists. Mutating a sub-list through one shows through the other. The copy duplicated the first floor, not the second.

Le sous-réflexe du numéroThis issue's sub-reflex

Avant de te fier à une copie, demande : jusqu'où descend-elle ? Si tu ne mutes que le contenant (ajouter/retirer un élément), une copie de surface suffit. Si tu mutes ce qu'il y a dedans, la copie de surface est un abri en carton — l'original le sentira.Before trusting a copy, ask: how deep does it go? If you only mutate the container (add/remove an element), a shallow copy is enough. If you mutate what's inside, the shallow copy is a cardboard shelter — the original will feel it.

Où l'on en est dans le Vol. II.Where we are in Vol. II.

Le №04 a nommé l'aliasing : un objet, plusieurs noms. Ce numéro outille la parade — copier — et en montre la vraie forme : une profondeur à choisir. Le №06 refermera le volume sur le cas le plus piégeux de copie de surface, le slicing d'une grille.№04 named aliasing: one object, many names. This issue tools the counter — copying — and shows its true shape: a depth to choose. №06 will close the volume on the trickiest shallow-copy case, slicing a grid.

🔒

La suite est réservée The rest is members-only

Le premier numéro est libre. Débloque tout The Python Loop — tous les volumes, à vie — pour 5 €, paiement unique. The first issue is free. Unlock all of The Python Loop — every volume, forever — for €5, one-time.

Retour au kiosqueBack to newsstand