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.