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.
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é
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.
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.
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.