Un muable dans une fonction☘
Exercice 1☘
Quel sera l'affichage obtenu avec le code ci-dessous. Expliquer.
1 2 3 4 5 6 7 8 | def f(): t.append(5) t = [2, 3, 4] f() print(t) |
Une réponse
On obtient:
1 | [2, 3, 4, 5] |
Il n'y a pas d'affectation t = ...
dans f, l'objet t est donc le même dans f et hors de f.
L'ajout "sur place" d'un élément agit donc bien sur l'objet t défini en ligne 6.
On peut afficher les identifiants:
1 2 3 4 5 6 7 8 9 10 | def f(): t.append(5) print(id(t)) t = [2, 3, 4] print(id(t)) f() print(t) |
on obtient bien le même identifiant aux deux niveaux (interne et externe à f).
Exercice 2☘
Quel sera l'affichage obtenu avec le code ci-dessous. Expliquer.
1 2 3 4 5 6 7 8 | def f(): t[1] = 666 t = [2, 3, 4] f() print(t) |
Une réponse
On obtient:
1 | [2, 666, 4] |
Il n'y a pas d'affectation t = ...
dans f, l'objet t est donc le même dans f et hors de f.
La modification "en place" d'un élément agit donc bien sur l'objet t défini en ligne 6.
On peut afficher les identifiants:
1 2 3 4 5 6 7 8 9 10 | def f(): t[1] = 666 print(id(t)) t = [2, 3, 4] print(id(t)) f() print(t) |
on obtient bien le même identifiant aux deux niveaux (interne et externe à f).
Exercice 3☘
Quel sera l'affichage obtenu avec le code ci-dessous. Expliquer.
1 2 3 4 5 6 7 8 9 10 | def f(): s = t + [5] print(s) t = [2, 3, 4] f() print(t) |
Une réponse
On obtiendra:
1 2 | [2, 3, 4, 5] [2, 3, 4] |
- On attribue l'étiquette t à l'objet [2, 3, 4] externe à f en ligne 6.
- On exécute ensuite f en ligne 7. En ligne 2, on évalue t + [5], ce qui crée un nouvel objet liste de contenu [2, 3, 4, 5]. Puis on attribue l'étiquette s à cet objet. Enfin on affiche le contenu ciblé par s en ligne 3. On sort ensuite de f: l'objet créé et son étiquette sont oubliés.
- On exécute ensuite la ligne 10: t a pour contenu [2, 3, 4].
Exercice 4☘
Quel sera l'affichage obtenu avec le code ci-dessous. Expliquer.
1 2 3 4 5 6 7 8 9 | def f(): t = t + [5] t = [2, 3, 4] f() print(t) |
Une réponse
On obtiendra une erreur.
- On attribue l'étiquette t à l'objet [2, 3, 4] externe à f en ligne 6.
- On exécute ensuite f en ligne 7.
En ligne 2, on pourrait penser qu'on évalue t + [5], ce qui crée un nouvel objet liste de contenu [2, 3, 4, 5],
puis que l'étiquette t est attribuée de nouveau à cet objet.
Mais nous avons vu qu'il ne pouvait coexister au sein d'une fonction avec une même étiquette un lien
étiquette-objet local à f et un lien étiquette-objet externe à f.
L'étiquette t ne peut donc qu'avoir une signification locale et la tentaive
t = t + [5]
ne peut qu'échouer puisque t n'a pas encore de valeur localement à f.
L'erreur obtenue:
1 | UnboundLocalError: local variable 't' referenced before assignment |