Python Language Mutable et immuable comme arguments


Exemple

L'un des principaux cas d'utilisation lorsqu'un développeur doit prendre en compte la mutabilité est lorsqu'il transmet des arguments à une fonction. Ceci est très important, car cela déterminera la capacité de la fonction à modifier des objets qui n'appartiennent pas à sa portée, c'est-à-dire si la fonction a des effets secondaires. Ceci est également important pour comprendre où le résultat d'une fonction doit être rendu disponible.

>>> def list_add3(lin):
    lin += [3]
    return lin

>>> a = [1, 2, 3]
>>> b = list_add3(a)
>>> b
[1, 2, 3, 3]
>>> a
[1, 2, 3, 3]

Ici, l'erreur est de penser que lin , en tant que paramètre de la fonction, peut être modifié localement. Au lieu de cela, lin et a référence le même objet. Comme cet objet est mutable, la modification est effectuée sur place, ce qui signifie que l'objet référencé à la fois par lin et a est modifié. lin n'a pas vraiment besoin d'être retourné, car nous avons déjà une référence à cet objet sous la forme d' a . a et b finissent par référencer le même objet.

Cela ne va pas la même chose pour les tuples.

>>> def tuple_add3(tin):
    tin += (3,)
    return tin

>>> a = (1, 2, 3)
>>> b = tuple_add3(a)
>>> b
(1, 2, 3, 3)
>>> a
(1, 2, 3)

Au début de la fonction, tin et a référence le même objet. Mais c'est un objet immuable. Ainsi , lorsque la fonction tente de le modifier, l' tin recevoir un nouvel objet avec la modification, en a conserve une référence à l'objet d' origine. Dans ce cas, le retour de l' tin est obligatoire ou le nouvel objet serait perdu.

Exercice

>>> def yoda(prologue, sentence):
    sentence.reverse()
    prologue += " ".join(sentence)
    return prologue

>>> focused = ["You must", "stay focused"]
>>> saying = "Yoda said: "
>>> yoda_sentence = yoda(saying, focused)

Note: reverse fonctionne sur place.

Que pensez-vous de cette fonction? At-il des effets secondaires? Le retour est-il nécessaire? Après l'appel, quelle est la valeur de saying ? De focused ? Que se passe-t-il si la fonction est appelée à nouveau avec les mêmes paramètres?