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⚓︎
Les références partagées⚓︎
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éthodecopy
de la classedict
:dico_b = dico_a.copy()
Sinon, utiliser le modulecopy
et sa fonctioncopy.copy()
. -
la copie profonde (« deep copy »)
Utiliser la fonction
copy.deepcopy()
pour tout copier de manière récursive.
# Tests
(insensible à la casse)(Ctrl+I)
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⚓︎
Portées d'une variable et espaces de nommage⚓︎
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 :
# Tests
(insensible à la casse)(Ctrl+I)
# Tests
(insensible à la casse)(Ctrl+I)