Skip to content

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