Cours de Python / Créer des tuples et déballer plusieurs valeurs
Un tuple Python est une séquence ordonnée dont on ne peut pas remplacer les références aux éléments. Il convient aux petits enregistrements de positions fixes et au déballage de plusieurs valeurs, mais un objet modifiable contenu dans le tuple peut encore changer.
Créer un tuple et comprendre ce qui est immuable
La virgule est déterminante pour créer un tuple ; les parenthèses clarifient le regroupement. Pour un seul élément, écrivez (3500,). L’expression (3500) reste un entier entre parenthèses. Ce petit programme permet d’observer le type et l’accès par index :
single = (3500,)
record = ("lunch", 8000)
print(type(single).__name__)
print(record[0])
Les deux lignes affichées sont tuple puis lunch. L’index 0 lit le premier élément. Le mot lunch désigne ici un déjeuner ; il fait partie des données conservées pour reproduire les mêmes résultats entre les traductions. La présentation des tuples et des séquences explique cette syntaxe.
Le tuple fixe les références à ses éléments. Il ne rend pas profondément immuable tout ce qu’il contient. Avec pair = ([1], 2), l’opération pair[0] = [] échoue avec une TypeError, car elle remplacerait le premier élément. En revanche, pair[0].append(3) modifie la liste déjà présente et donne ([1, 3], 2). Les règles de modification et de partage des listes restent applicables à cet objet intérieur.
Exécuter un déballage complet
Python 3 et sa bibliothèque standard suffisent. Enregistrez tout le bloc suivant dans tuples.py, en UTF-8, dans un dossier d’exercice. Depuis un terminal ouvert dans ce dossier avec l’environnement virtuel du projet activé, lancez python tuples.py. Sur macOS ou Ubuntu hors environnement virtuel, utilisez python3 si c’est le nom de votre interpréteur.
record = ("lunch", 8000, "food")
name, amount, category = record
print(name, amount, category)
first, *rest = [3500, 8000, 2500]
print(first, rest)
a, b = 1, 2
a, b = b, a
print(a, b)
La sortie attendue est :
lunch 8000 food
3500 [8000, 2500]
2 1
La première affectation répartit les trois éléments de record entre name, amount et category ; food signifie « alimentation ». L’étoile devant rest recueille les éléments restants dans une liste : first vaut 3500 et rest contient 8000 et 2500. Enfin, les expressions à droite de a, b = b, a sont évaluées avant leur affectation : les deux valeurs sont échangées sans variable temporaire explicite.
Vérifier le nombre et le sens des éléments
Sans cible étoilée, le nombre d’éléments doit correspondre au nombre de cibles. Une valeur manquante ou en trop produit une ValueError. Une cible étoilée reçoit une liste, éventuellement vide, et une même liste de cibles ne peut contenir qu’une cible étoilée. La référence des affectations et du déballage précise ces règles.
Le nombre ne suffit pas : les positions doivent aussi garder leur sens. Intervertir un montant et une catégorie peut respecter trois éléments tout en associant des données inadaptées aux noms. Pour une source extérieure, vérifiez la structure des enregistrements et le format du montant avant de poursuivre.
Parcourir directement un dictionnaire fournit ses clés. Si vous souhaitez déballer chaque clé et sa valeur, parcourez ses items(). Recevoir deux noms à partir d’un dictionnaire de deux entrées ne signifie pas que l’un reçoit une clé et l’autre une valeur.
Choisir la structure et comparer les erreurs
| Besoin | Structure à envisager |
|---|---|
| Ajouter progressivement des montants | Une liste modifiable |
| Garder un petit groupe de positions définies | Un tuple |
| Accéder à de nombreux champs par leur nom | Un dictionnaire ou une dataclass |
Un tuple ne peut servir de clé de dictionnaire que si ses éléments sont tous hachables, c’est-à-dire compatibles avec les exigences de stabilité du hachage et d’égalité décrites dans le glossaire Python sur les objets hachables. Un tuple contenant une liste ne l’est pas. Une structure extérieure fixe ne suffit donc pas à autoriser son emploi comme clé.
- Retirez uniquement
"food"du tuple record dans le programme complet, en conservant trois cibles. L’affectation lève une ValueError avant le premier affichage. - Adaptez ensuite les cibles à
name, amount = recordet l’affichage àprint(name, amount). La première ligne devientlunch 8000et les deux suivantes restent inchangées. Les références à category doivent aussi être supprimées. - Rétablissez le tuple à trois éléments, les trois noms et l’affichage initial pour retrouver les trois lignes attendues.
- Dans le petit premier exemple, retirez seulement la virgule de
(3500,). Le type affiché devientint. Remettez la virgule pour retrouver tuple.
Quand le rôle d’une position devient difficile à mémoriser, préférez des champs nommés. Le tuple protège le lien entre ses positions et leurs objets, mais ne valide ni la signification des valeurs ni les modifications possibles de leurs objets intérieurs.




