Aller au contenu

Particularités de Python 3

Mutabilité des objets⚓︎

Notions de Python avancées : mutabilité des objets, ...⚓︎

En Python :

  • les objets de type 'bool', 'int', 'str', 'bytes', 'tuple', 'range' et 'frozenset' sont immuables.

  • Tous les autres types ('list' (listes), 'dict' (dictionnaires), 'set' (ensembles) ou instances de ses propres classes (en programmation orientée objets)) sont des objets mutables.

Les objets mutables sont à utiliser avec précaution, car leur valeur peut changer sans que l'on ne l’ait explicitement demandé. C'est ce que l'on appelle un « effet de bord ». Cela peut arriver lorsqu’une valeur mutable est passée en argument à une fonction.

Fichier PDF

Objets mutables & objets immuables⚓︎

Objets mutables & objets immuables (US) | Real Python (09:55)

Les références partagées⚓︎

Les références partagées | MOOC de l'INRIA (10:57)

Plusieurs variables peuvent référencer le même objet :

Rappel : mutable vs immutable⚓︎

Les entiers, les chaînes, les tuples sont immutables, ils ne peuvent pas être modifiés. Il n’y a pas d’effet de bord possible sur un objet immutable. Il est impossible qu’une modification sur b affecte a:

Idem avec objet mutable⚓︎

Si comme précédemment, a et b sont deux références vers le même objet, que se passe-t-il si l’objet est mutable ?

  • Il peut être changé.
  • On peut impacter toutes les références vers cet objet :
    • depuis une variable ;
    • ou depuis l’intérieur d’un autre objet.

Types mutables / immutables⚓︎

Type Mutable ? Exemple
int et autres nombres non a = 1
str non a = "abcd"
list oui a = [1, 2, 3]
tuple non a = (1, 2, 3)
dict oui a = {1: 'a', 2: 'b'}
set oui a = {1, 2, 3}
frozenset non a = {1, 2, 3}

Les types tuple et frozenset permettent notamment de construire des clés pour les dictionnaires et autres ensembles.

Copie superficielle et copie profonde⚓︎

Pour ne pas modifier b, il faut faire une copie de a. Il y a deux types de copies en Python :

  • la copie superficielle (« shallow copy »)

    Pour les toutes les séquences, utiliser simplement : a[:]
    Pour les dictionnaires, utiliser la méthode copy de la classe dict : dico_b = dico_a.copy()
    Sinon, utiliser le module copy et sa fonction copy.copy().

  • la copie profonde (« deep copy »)

    Utiliser la fonction copy.deepcopy() pour tout copier de manière récursive.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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
Évaluations restantes : /∞

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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
Évaluations restantes : /∞

Différence entre copie superficielle et copie profonde⚓︎

La différence entre copie superficielle et copie profonde n’existe que pour les objets composites (les objets qui contiennent d’autres objets)

  • Copie superficielle :

    crée un nouvel objet composite et y insère les références vers les objets contenus dans l’original

  • Copie profonde :

    crée un nouvel objet et insère de manière récursive une copie des objets trouvés dans l’original et évite les boucles infinies

Mutabilité des variables et effet de bord avec Pythontutor⚓︎

Démonstration en ligne

Portées d'une variable et espaces de nommage⚓︎

Démonstration sur Trinket

Différence entre « fonction » et « procédure » en Python⚓︎

Fonction / Procédure

En programmation :

  • par définition, toute fonction est censée renvoyer une valeur,

  • Une « fonction » qui ne renvoie pas de valeur n’est pas une fonction : on appelle cela en programmation une procédure.

Particularités des prodédures en Python

En Python, en fait, même les fonctions sans instruction return explicite renvoient une valeur qui est None. La valeur None est une valeur qui correspond justement à l’absence de valeur. Cette valeur sert à indiquer « il n’y a pas de valeur ».

L’interpréteur Python l’ignore lorsque c’est la seule valeur qui est renvoyée mais elle existe tout de même et c’est la raison pour laquelle on appelle les fonctions qui ne possèdent pas de return explicite des « fonctions » en Python.

Exemple :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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
Évaluations restantes : /∞

Annotations des fonctions ou procédures Python⚓︎

Site à consulter

Différence entre « arguments » et « paramètres » d'une fonction ou procédure⚓︎

Site à consulter

Chaînes formatées (f-strings) par Pascal Ortiz⚓︎

Site à consulter