In [1]:
def echanger(liste, indice1, indice2):
    """
    liste -- liste d'entiers
    indice1 -- entier, indice d'un élément de la liste
    indice2 -- entier, indice d'un élément de la liste
    
    renvoie une liste de même contenu que liste mais dans laquelle
    les éléments d'indices indice1 et indice2 sont échangés.
    """
    # on commence par créer une nouvelle liste
    # de même contenu que liste:
    nvListe = [element for element in liste]  
    # on échange les éléments dans cette nouvelle liste:
    nvListe[indice1], nvListe[indice2] = nvListe[indice2], nvListe[indice1]
    return nvListe
In [2]:
a = [2, 3, 4]
In [3]:
b = echanger(a, 0, 1)
In [4]:
a
Out[4]:
[2, 3, 4]
In [5]:
b
Out[5]:
[3, 2, 4]

Cette fonction est sans effet de bord. Elle ne modifie pas d'élément défini hors d'elle-même (la liste a est inchangée).

Mais évidemment, on ne peut plus dire qu'elle a échangé les éléments d'indice1 et d'indice2 de la liste passée en argument: la liste passée en argument est inchangée. La fonction renvoie une autre liste présentant l'échange demandé.

Les deux fonctions ont leur utilité, dans des contextes différents.

In [ ]: