Aller au contenu

Méthode append et ajouts

I. La méthode append⚓︎

Exercice

1. Exécuter le script ci-dessous. Que se passe-t-il ?

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution

appendest une méthode qui modifie la liste mais ne renvoie rien (soit None) donc ma_liste.append(1) est une expression qui vaut None. La fonction ajoute_6 renvoit donc None, qui est affecté à resultats.

2. Exécuter le script ci-dessous. Que se passe-t-il ?

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution

La fonction ajoute_6 renvoie donc None, mais la liste resultats a été modifiée en place.

⚠️ 🌵 Ce n'est pas du tout une bonne pratique de procéder ainsi, et il ne faut pas le faire.

👉 Il faut préférer :

def ajoute_5(ma_liste):
    ma_liste.append(1)
    return ma_liste

II. L'opérateur +=⚓︎

Cas des nombres ou des chaînes de caractères

Pour les nombres, les chaînes de caractères ou les tuples : s = s + v est équivalent à s += v

Code 1

Exécuter le script ci-dessous.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Code 2

Exécuter le script ci-dessous.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Cas des listes

  • ma_liste += [4] se comporte comme ma_liste.append(4). L'opérateur += modifie la liste en place
  • ma_liste = ma_liste + [4] crée une nouvelle liste qui est le résultat de la concaténation de ma_liste et [4]. La liste originale n'est pas modifiée en place.
  • Remarquons que ma_liste += [4, 5, 6] est l'équivalent de ma_liste.extend([4, 5, 6]). La liste ma_liste est aussi modifiée en place.
    Donc ma_liste += [4] est équivalent à ma_liste.extend([4])

Que se passe-t-il dans le Code 1 et dans le Code 2 ?

👉 Dans le Code 1

  • ma_liste = [1, 2, 3] : Une liste est créée avec les éléments [1, 2, 3].
  • Appel de la fonction ajouter_element. La fonction est appelée avec ma_liste comme argument : ajouter_element(ma_liste) :.
  • Modification de la liste dans la fonction : ma_liste = ma_liste + [4] : Cette ligne crée une nouvelle liste qui est le résultat de la concaténation de ma_liste et [4]. La nouvelle liste [1, 2, 3, 4] est assignée à la variable locale ma_liste à l'intérieur de la fonction. Cette opération ne modifie pas la liste originale passée en argument, mais crée une nouvelle liste locale à la fonction.
  • print(ma_liste) : La liste originale ma_liste n'a pas été modifiée par la fonction ajouter_element, donc il s'affiche [1, 2, 3].

👉 Dans le Code 2

  • ma_liste = [1, 2, 3] : Une liste est créée avec les éléments [1, 2, 3].
  • Appel de la fonction ajouter_element. La fonction est appelée avec ma_liste comme argument : ajouter_element(ma_liste) :
  • Modification de la liste dans la fonction : ma_liste += [4] : Cette ligne utilise l'opérateur += pour ajouter [4] à ma_liste ce qui modifie la liste en place.
  • Les listes sont des objets mutables et la méthode append opère une mutation de la liste sans en créer une nouvelle. Or la variable locale et la variable globale désignent la même liste. La différence dans le code 1 est que la variable locale et la globale désignent aussi la même liste au début, mais après l’affection liste = liste + [4], la variable locale désigne une autre liste.
  • print(ma_liste) : Après l'appel de la fonction ajouter_element, ma_liste a été modifiée pour inclure l'élément 4, donc il s'affiche [1, 2, 3, 4].

Bonne pratique

  • Il vaut mieux utiliser les méthodes append ou extend pour modifier une liste en place, l'opérateur + pour créer une nouvelle liste.
  • Il vaut mieux éviter d'utiliser l'opérateur += avec des listes.

Crédits⚓︎

Avec l'aide judicieuse de Serge Bays et de Frédéric Zinelli.