dimanche 1 octobre 2023

Les tranches en Python et Golang

 Les tranches ou slice sont présentes en Python sous deux formes:

La forme simple à la volée sous forme de fonction


Sous forme objet avec les slices nommés:

...

Avec  3 attributs et une  méthode spécifique

La méthode indices prend une longueur en paramètre et retourne les limites du découpage (utilité limitée)

Les tranches nommées sont utiles pour découper des lignes possédant des champs de taille fixe.
avec par exemple 
code_postal = [1,7)]
nom = [7,27]
etc ..


En golang.

Les tranches s'appuient sur des tableaux ou à défaut embarque un tableau interne.
Leur définition doit comporter: le type des données, la longueur et la capacité.
tranche_a := make([]int, 3, 6)


(ici longueur = 3 pour une capacité de 6)

Avec quelques pièges: 
tranche_b := tranche_a[1:3]

Si on modifie tranche_b ou tranche_a, les deux seront modifiés

tranche_b[0] = 42

Ce comportement peut évoluer si on ajoute des éléments par la fonction append. Si la longueur dépasse la capacité , automatique le tableau donnera lieu à un nouveau tableau d'un capacité augmentée. 

tranche_b = append(tranche_b, 19)
tranche_b = append(tranche_b, 20)
tranche_b = append(tranche_b, 21)
tranche_b = append(tranche_b, 22)
tranche_b = append(tranche_b, 23)
tranche_b[0] = 99


Dans ce dernier cas tranche_a et tranche_b pointeront vers deux espaces différents.

tranche_a [3 42 0] capacité: 6 taille: 3

tranche_b [99 0 18 19 20 21 22 23] capacité: 10 taille: 8


Pour éviter tout effet de bord:

  • Utiliser la fonction copy qui va dès le départ créer deux zones mémoires distinctes.
  • Utiliser la forme slice[debut:fin:max] pour éviter les effets de bord d'append.