Résolue

Erreur sur le passage par valeur et par référence en Python

# Notions théoriques # Python

Dans cette section du cours (à partir de 3:45), il est expliqué que Python effectue :

  • un passage par valeur quant l'objet envoyé en argument est immuable

  • un passage par référence quant l'objet envoyé en arguement est muable.

Y'a pas une erreur la ?

D'après ce que j'ai pu comprendre et tester, lors de l'envoi d'un argument à une fonction, c'est un passage par "référence de l'objet" qui est effectué. Peu importe que mon objet soit muable ou immuable, quand je fais ma_fonction(mon_objet), c'est systématiquement la référence de l'objet mon_objet qui est envoyé à la fonction.

Du coup y'aurai pas une petite erreur dans le cours ?
Je me base notamment sur cet article : https://realpython.com/python-pass-by-reference/

Bonjour,

En effet, la vidéo est mal expliquée et tu as raison.

La raison pour laquelle il y a une différence de facto entre les objets muables et immuables vient du fait qu'on ne peut justement pas modifier un objet muable.

On ne risque donc pas d'effets de bord comme celui qu'on a avec la liste.

Ce qui mélange souvent au début c'est que les noms peuvent différer en dehors et à l'intérieur de la fonction, pourtant on modifie le même objet :

nombres = [10, 20]

def foo(liste):
    liste.append(30)

foo(nombres)
print(nombres)  # [10, 20, 30]

Ci-dessus même si les noms sont différents (nombres / listes), c'est bien la même liste qui est modifiée, vu qu'on passe l'objet en référence et qu'il est muable.

Avec un objet immuable, on passe aussi la référence, mais on ne peut pas le modifier, si on le fait, on crée donc un nouvel objet :

a = 10

def foo(nombre):
    print(id(nombre))
    nombre = 20
    print(id(nombre))

>>> id(a)
4325707560
>>> foo(a)
4325707560
4325707880

👉 Le premier print(id(nombre)) dans la fonction affiche 4325707560 : c'est le même objet dans l'espace global et local
👉 Le second print(id(nombre)) affiche un id différent : 4325707880, la variable nombre étant un objet immuable, on ne peut pas le modifier : un nouvel objet est donc créé

Désolé pour cette confusion, j'espère que c'est clair pour le fonctionnement, n'hésite pas si tu as d'autres questions !

C'est très clair, merci !

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.