Adloun

Les tranches (slices) sont explicitement hors programme

Exercice supplémentaire · niveau 2 · NSI (première), chapitre 4 — Les types construits · Aux frontières du programme

Énoncé

Les tranches (slices) sont explicitement hors programme. Les découvrir une fois permet de comprendre pourquoi. Que valent t[1:4], t[:2], t[3:] et t[:] sur t = [10, 20, 30, 40, 50] ? Et quel piège t[:] cache-t-il sur une matrice ?

Corrigé


t = [10, 20, 30, 40, 50]

t[1:4]      # [20, 30, 40]  : de l'indice 1 INCLUS a l'indice 4 EXCLU
t[:2]       # [10, 20]      : depuis le debut
t[3:]       # [40, 50]      : jusqu'a la fin
t[:]        # [10, 20, 30, 40, 50] : une COPIE du tableau entier

La convention est celle de range : borne de gauche incluse, borne de droite exclue. C'est ce qui donne éléments, et permet de recoller deux tranches consécutives sans — la note de Dijkstra citée dans le cours.

Le piège de t[:] sur une matrice.


m = [[1, 2], [3, 4]]
mc = m[:]               # on croit copier la matrice
mc[0][0] = 99
print(m)                # [[99, 2], [3, 4]]   <- m a change

m[:] est exactement list(m) : une copie superficielle. Elle copie le tableau extérieur et partage les lignes. La forme concise t[:] est même plus dangereuse que list(t), parce qu'elle ressemble à une copie complète.

Pourquoi le programme les écarte. Trois raisons cohérentes : elles sont propres à Python (un tableau, au sens général, ne se découpe pas ainsi) ; elles masquent une boucle et donc un coût — t[1:100000] recopie éléments sans que rien ne le laisse voir ; et elles fabriquent silencieusement des copies superficielles. Les connaître pour lire du code, ne pas s'en servir pour en écrire : c'est exactement l'usage que le programme recommande.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.