
Il y a des soirs où le code ressemble à une recette de cuisine dont on aurait perdu la moitié des pages. Un mardi soir pluvieux en mai dernier, j'étais assise à cette même table, mon mug de thé refroidissant à côté de mon ordinateur portable, et je n'arrivais pas à comprendre pourquoi mon script me hurlait dessus. J'essayais simplement de changer une valeur dans ce que je pensais être une liste de coordonnées pour un petit projet de cartographie locale autour de Clermont. Mais Python, ce soir-là, avait décidé d'être mon pire ennemi.
Ce soir où tout a basculé (à cause d'une parenthèse)
Dans ma formation-python que je suis tant bien que mal après le boulot, on m'avait dit que les listes se faisaient avec des crochets [] et les tuples avec des parenthèses (). Sur le papier, ça avait l'air simple. Sauf qu'après trois semaines de cours, j'ai commencé à les mélanger joyeusement. Pour moi, c'était juste une question d'esthétique, comme choisir entre un saladier bleu ou un saladier vert.
Ce soir-là, j'avais créé ce que je pensais être une liste : ma_position = (45.77, 3.08). Je voulais mettre à jour la première valeur. Je savais que l'index de départ en Python est 0, alors j'ai fièrement tapé ma_position[0] = 45.78. Et là, le drame. Un message d'erreur rouge vif, un TypeError, s'est affiché sur mon terminal. Le ronronnement du réfrigérateur dans le silence de la cuisine alors que je fixe le curseur qui clignote sur mon erreur me semblait soudain beaucoup plus fort. J'ai ressenti cette frustration puérile d'avoir envie de secouer mon ordinateur parce qu'il refuse de juste changer un chiffre dans mon tuple.

Pourquoi Python est aussi têtu ?
Après avoir pesté pendant de longues minutes, j'ai fini par rouvrir mes notes. C'est là que le mot barbare est apparu : immuabilité. En gros, un tuple est un objet qu'on ne peut pas modifier une fois qu'il est créé. C'est gravé dans le marbre. Si vous essayez de changer une lettre ou un chiffre à l'intérieur, Python se braque. C'est ce qu'on appelle l'immuabilité.
À l'inverse, la liste est malléable. C'est le carnet de brouillon où on peut gommer, raturer, rajouter des pages. J'ai réalisé que j'utilisais des parenthèses là où j'avais besoin de flexibilité. J'ai passé une partie de la soirée à tout transformer en crochets, juste pour voir mon code s'exécuter sans râler. Mais une question restait en suspens : si les listes sont si pratiques, pourquoi s'embêter avec des tuples qui nous empêchent de travailler ?
Mon déclic : le sac de courses et le menu du restaurant
Le déclic est venu quelques jours plus tard, alors que je préparais ma liste de courses pour le marché de la place de Jaude. J'ai compris que la liste Python, c'est mon sac de courses. J'y mets des poireaux, puis je me ravise, je les enlève, je rajoute du fromage de Saint-Nectaire, je change l'ordre des articles... C'est vivant, ça bouge. C'est exactement ce que je fais quand je cherche à trier une liste en python sans tout mélanger.
Le tuple, lui, c'est le menu du restaurant imprimé et plastifié que le serveur dépose sur votre table. Vous ne pouvez pas prendre un stylo et changer le prix du plat du jour ou remplacer le dessert par autre chose. Le menu est une information fixe, une référence. Si le restaurant veut changer le menu, il doit en imprimer un nouveau. En Python, c'est pareil : si vous voulez changer un tuple, vous devez en créer un tout nouveau.
Cette analogie m'a sauvée. Maintenant, quand je crée une variable, je me demande : « Est-ce un sac de courses ou un menu ? ». Mes coordonnées GPS pour mes randonnées dans la chaîne des Puys ? C'est un menu, ça ne devrait pas bouger en plein milieu de mon calcul. Ma liste de livres à lire pour cet automne ? C'est un sac de courses, je vais en ajouter et en supprimer tout le temps.
La petite virgule qui change tout
Il y a un truc qui m'a rendue dingue en août dernier. J'essayais de créer un tuple avec un seul élément. J'ai écrit mon_tuple = (42). Et devinez quoi ? Python m'a dit que c'était un entier (un int), pas un tuple. J'ai failli abandonner. C'est là que j'ai découvert la règle la plus bizarre du langage : la syntaxe d'un tuple à un seul élément doit obligatoirement inclure une virgule traînante, comme ça : (élément,).
Sans cette virgule, Python pense que les parenthèses sont juste là pour faire un calcul mathématique, comme à l'école. C'est le genre de petit détail qui vous fait sentir très bête quand vous débutez, mais une fois qu'on le sait, on se sent comme une initiée. C’est un peu comme quand j’ai commencé à regarder comment découvrir l'automatisation réseau avec python pour simplifier ses tâches, j'ai réalisé que chaque petit détail de syntaxe a une raison d'être, même si elle nous échappe au début.
Faut-il vraiment s'embêter avec la mémoire ?
Si vous traînez sur des forums de développeurs, vous lirez souvent que les tuples sont « plus rapides » et qu'ils consomment moins de mémoire vive que les listes. Apparemment, comme Python sait que le tuple ne changera jamais, il n'a pas besoin de prévoir de la place supplémentaire « au cas où », contrairement aux listes qui sont toujours un peu plus gourmandes.
Au début, j'ai voulu faire la bonne élève. J'ai essayé de mettre des tuples partout dans mes petits scripts pour « économiser de la mémoire ». Spoiler : c'était une perte de temps totale. Pour nous, les débutants qui gérons des collections de dix ou vingt éléments, la différence de performance est absolument invisible. Pire encore, forcer l'usage de tuples là où on a besoin de modifier des données rend le code illisible et pénible à maintenir.
Aujourd'hui, mon avis est tranché : n'utilisez pas de tuples juste pour la performance si vous débutez. Utilisez-les pour la sécurité. Utilisez-les quand vous voulez être sûre qu'une valeur ne sera pas modifiée par erreur par une autre partie de votre programme. C'est une protection pour votre futur « vous », celui qui sera fatigué après le boulot et qui risquerait de faire une bêtise dans son code.

Quand choisir quoi sans se prendre la tête
Pour résumer mes six mois de tâtonnements entre le printemps et cet automne, voici ma règle d'or simplifiée :
- Choisissez la liste si vous allez utiliser
append(), si vous voulez supprimer des éléments, ou si vous prévoyez de faire la somme d'une liste python qui s'agrandit au fil du temps. - Choisissez le tuple pour des choses qui vont par paires ou par groupes naturels et qui ne changent pas : une date de naissance, des coordonnées géographiques, ou les réglages de base de votre programme.
En suivant cette logique, j'ai arrêté de me battre avec les TypeError. Mon code est devenu plus clair. Je sais que si je vois des parenthèses, c'est une donnée stable, un point de repère. Si je vois des crochets, c'est un espace de travail. J'utilise encore souvent la fonction len en python pour compter mes éléments, que ce soit pour l'un ou pour l'autre, et c'est rassurant de voir que certaines choses fonctionnent de la même manière pour les deux.
Ce soir, le Puy de Dôme est caché derrière les nuages, mais mon écran est propre, sans message d'erreur rouge. J'ai enfin rangé mes envies de lecture dans une liste et mes coordonnées préférées dans un tuple. C'est une petite victoire, mais dans ce long voyage pour apprendre Python, chaque petite victoire compte. Je me demande quand même si je ne devrais pas commencer à regarder les dictionnaires... mais ça, ce sera pour une autre fin de soirée, quand j'aurai racheté du thé.