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

Le slicing copie le contenant, jamais le contenu Slicing copies the container, never the content

sous = grille[:] a tout d'une copie franche : le crochet vide dit « tout, en neuf ». C'en est une — d'un seul niveau. Sur une liste de listes, les lignes restent partagées, et un sous[0].append() rejaillit sur l'original. Pire, [[0]*3]*3 fabrique trois noms sur une même ligne. Et l'affectation de tranche a[:] = X ne copie rien : elle mute l'objet en place, sous tous ses alias. sub = grid[:] looks every bit an honest copy: the empty bracket says 'all of it, fresh'. It is one — of a single level. On a list of lists, the rows stay shared, and a sub[0].append() splashes back onto the original. Worse, [[0]*3]*3 makes three names for one row. And slice assignment a[:] = X copies nothing: it mutates the object in place, under all its aliases.

AudienceAudience
Dev qui manipule des listes de listes, grilles et matrices Dev handling lists of lists, grids and matrices
Format
Self-paced
ChapitresChapters
5
Date
Juil 2026 Jul 2026
≈ 17 min ●●○○ SlicingCopiesAliasing

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

Le crochet vide dit « tout ». Il ne copie qu'un étage.The empty bracket says "everything". It copies one floor.

Le numéro précédent a établi qu'une copie a une profondeur. Voici l'idiome qui le fait oublier le plus vite : grille[:]. Le crochet vide se lit « la grille entière, en neuf » — il donne une telle impression de totalité qu'on ne pense pas à la profondeur. Or slicing une liste produit une copie de surface, exactement comme list(x) : un contenant neuf, les mêmes éléments. Sur une liste de listes, les lignes ne sont pas dupliquées — elles sont partagées. Le [:] a l'air du geste le plus franc de Python ; c'est l'un des plus trompeurs.The previous issue established that a copy has a depth. Here's the idiom that makes you forget it fastest: grid[:]. The empty bracket reads 'the whole grid, fresh' — it gives such an impression of totality that depth never comes to mind. Yet slicing a list produces a shallow copy, exactly like list(x): a fresh container, the same elements. On a list of lists, the rows aren't duplicated — they're shared. The [:] looks like Python's most honest move; it's one of its most deceptive.

La « copie » qui laisse fuir les lignesThe 'copy' that lets the rows leak
grille = [[1, 2], [3, 4]]
sous = grille[:]           # « une copie complète de la grille » — vraiment ?
sous[0].append(99)         # je mute une ligne de la copie
print(grille)              # [[1, 2, 99], [3, 4]] — la grille d'origine a changé
Deux contenants, des lignes en communTwo containers, rows in common
grille
sous = grille[:]
contenants distinctsdistinct containers
[1, 2, 99] ← partagée
[3, 4] ← partagée

grille[:] a bien créé une nouvelle liste externe — mais elle range dedans les mêmes lignes. sous[0] et grille[0] sont un seul objet ; l'append sur l'un se lit sur l'autre.grille[:] did create a new outer list — but it stores the same rows inside. sous[0] and grille[0] are one object; the append on one reads on the other.

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

Ne lis jamais [:] comme « copie profonde ». Lis-le comme « nouveau contenant, mêmes éléments ». Sur une liste plate d'immuables, c'est une vraie copie ; dès qu'il y a un niveau mutable dessous — lignes, dicts, objets — [:] ne protège que la coquille.Never read [:] as "deep copy". Read it as "new container, same elements". On a flat list of immutables it's a real copy; as soon as there's a mutable level underneath — rows, dicts, objects — [:] protects only the shell.

Le numéro qui ferme le Vol. II.The issue that closes Vol. II.

Trois numéros, une seule idée déclinée : l'aliasing (№04, un objet plusieurs noms), la copie et sa profondeur (№05), et ici la forme la plus familière de copie de surface. Le slicing cache aussi une seconde vie — l'affectation de tranche — qui, elle, ne copie pas du tout mais mute en place. On y arrive au chapitre 3.Three issues, one idea in variations: aliasing (№04, one object many names), copying and its depth (№05), and here the most familiar form of shallow copy. Slicing also hides a second life — slice assignment — which copies nothing at all but mutates in place. We reach it in chapter 3.

🔒

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