Aller au contenu

Fonction à effet de bord

Dans le paragraphe sur la distinction entre les variables locales et les variables globales, nous avons vu que les paramètres des fonctions sont considérés comme des variables locales à la fonction.

Est-ce toujours le cas avec un type muable (comme le type list) en paramètre plutôt qu'avec un type immuable (comme les types int ou str) ?

Illustration

Copiez/collez/exécutez le code de la fonction définie ci-dessous :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
def prolonger(tab1, tab2):
    """
    tab1, tab2 - list, deux tableaux

    Sortie : None - Prolonge le tableau tab1 avec les éléments du tableau tab2
             (fonction à effet de bord, ne renvoie rien)
    >>> T1 = [1, 2, 3]
    >>> T2 = [42, 666, 2001]
    >>> prolonger(T1, T2)
    >>> T1
    [1, 2, 3, 42, 666, 2001]
    """
    for element in tab2:
        tab1.append(element)

Vérifiez, en utilisant la fonction id(), que votre objet T1 est bien le même objet (dont le contenu a changé) avant l'appel à la fonction prolonger() et après cet appel.

Remarque

Le langage Python propose en fait déjà en natif une telle fonction.
Voir par exemple cette page.

Définition

Extrait de wikipedia

En informatique, une fonction est dite à effet de bord (traduction mot à mot de l'anglais « side effect », dont le sens est plus proche de « effet secondaire ») si elle modifie un état en dehors de son environnement local, c'est-à-dire si elle a une interaction observable avec le monde extérieur autre que renvoyer une valeur.

Par exemple,

  • les fonctions qui modifient une variable non locale ou un argument muable passé par référence,
  • les fonctions qui effectuent des opérations d'entrées-sorties
  • ou les fonctions appelant d'autres fonctions à effet de bord.

Souvent, ces effets compliquent la lisibilité du comportement des programmes et/ou nuisent à la réutilisabilité des fonctions et procédures.

Le caractère muable des objets de type list amène assez naturellement à écrire de telles fonctions à effet de bord, c'est-à-dire des fonctions qui modifient le tableau passé en argument sans créer de nouveau tableau.