- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compte person00:00:00 :Dans cette partie, on va voir ce qu'on appelle le passage par référence, donc l'idée en fait quequand on passe une valeur à une fonction, on va passer une référence à l'objet. Alors je vais
00:00:10 :vous expliquer tout ça, accrochez-vous, ça peut être un petit peu déroutant au début mais c'estune notion fondamentale à comprendre parce que ça peut vraiment vous jouer des tours. Donc là,
00:00:18 :j'ai une fonction que j'ai appelée foo tout simplement, qui contient un paramètre. Àl'intérieur de cette fonction, j'affiche le id, donc l'identifiant de cette variable qui estdéfinie dans l'espace local de ma fonction. En dehors de ma fonction, dans l'espace global,
00:00:32 :j'ai une variable var qui est égale à 5, j'affiche l'identifiant de cette variable etensuite j'appelle ma fonction foo en passant cette variable ici, donc var, à mon paramètre. Donc là,
00:00:43 :on va afficher l'identifiant de param et l'identifiant de var. Si j'exécute le script,vous voyez qu'on a le même identifiant. Donc c'est ce que je voulais dire au début de cette vidéo
00:00:52 :en parlant de passage par référence. Vous voyez ici que param et var vont référencer le mêmeobjet, donc dans ce cas-ci le nombre 5 en mémoire. Donc on a deux variables différentes, une variable
00:01:02 :dans l'espace local de la fonction et une variable dans l'espace global, mais ces variablesréférencent le même objet. Alors dans ce cas-ci, avec un objet de type immuable, donc un nombre
00:01:12 :entier, ça ne pose pas trop de problèmes puisqu'on ne peut pas modifier cet objet. Donc si dans mafonction ici je dis que param est égal à 10, on va en fait créer un nouvel objet, donc une nouvellevariable param qui va être égale à 10 et on ne va pas toucher notre variable dans l'espace global
00:01:27 :puisqu'on ne peut pas modifier un objet de type nombre entier. Si on fait une affectation d'unenouvelle valeur, on va créer un nouveau nom avec un nouvel objet en mémoire. Donc dans ce cas-ci,
00:01:36 :si je fais après l'exécution de ma fonction un print de var, on va bien avoir toujours lavaleur de 5. Donc même si au départ vous voyez qu'on avait le même objet, donc var et param qui
00:01:47 :pointaient vers le même objet en mémoire, là on a créé un nouvel objet et on n'a pas touché àl'objet var dans l'espace global de mon script. Maintenant c'est un petit peu différent avec des
00:01:57 :objets muables. Donc par exemple si je mets une liste ici, et c'est là que ça peut commencer àvous jouer des tours, si je crée une variable qui s'appelle var et qui est égale à une liste etqu'à l'intérieur de ma fonction ici je fais param.append et que j'ajoute 1. Je vais juste
00:02:12 :exécuter le code pour vous montrer ce que ça donne. On voit que quand on fait un print de var,après l'exécution de la fonction, cette fois-ci var a bien été modifié. Donc pourquoi ? Eh bien on
00:02:22 :va tout simplement refaire un print de id de param et un print de id de var. Donc on va seretrouver là encore avec le même identifiant qui signifie bien que quand on passe notre variable icià notre fonction, eh bien on se retrouve ici à l'intérieur de la fonction avec le même objet.
00:02:39 :Donc on a bien var et param qui pointent vers la même liste en mémoire. Donc forcément comme onmodifie par la suite dans notre fonction cette liste, on va modifier cet objet et nos variablesvar et param vont pointer vers ce même objet. Donc on a deux noms différents, var et param,
00:02:56 :qui pointent vers le même objet en mémoire. Donc si on modifie cet objet dans notre fonction,logiquement quand on revient dans notre espace global et qu'on affiche notre variable qui pointetoujours vers ce même objet qu'on a modifié, eh bien cet objet sera également modifié. Donc vous
00:03:09 :voyez que dans certains cas ça ne pose pas de problème quand on est en présence d'un objetimmuable. Eh bien forcément on ne peut pas modifier cet objet donc on n'aura pas de conflit.
00:03:17 :Par contre quand on a un objet qui est de type muable qu'on peut modifier, eh bien là vousvoyez qu'il faut vraiment avoir en tête cette notion qu'on passe en fait une référence ànotre objet et que donc on peut se retrouver à avoir deux variables qui pointent vers le même
00:03:30 :objet et que si on modifie notre objet dans la fonction, eh bien on va également le modifieren dehors de la fonction. Alors pour ne pas avoir ce problème, qu'est ce qu'on pourrait faire ? Eh
00:03:39 :bien on pourrait tout simplement créer une nouvelle variable qui est une liste vide ici etensuite on va modifier donc cette liste mais là comme on a créé un nouvel objet on ne va pastoucher à l'objet qui est en dehors de notre fonction. Donc si je réexécute le script vous
00:03:52 :voyez que cette fois-ci notre variable à l'extérieur de la fonction n'a pas été modifiée. On peutégalement faire une copie de la liste puisque là si je mets 1, 2 et 3 et que je veux ajouter 4dans cette fonction, eh bien si j'exécute le code là on aura uniquement le nombre 4 puisqu'on a
00:04:07 :défini une liste vide. Donc ce que je peux faire c'est créer une copie en faisant param.copy doncje fais une copie de cette liste. Là je vais l'appeler autrement juste pour bien vous montrer
00:04:16 :que c'est un objet différent donc on va l'appeler test par exemple et on va printer test. Donc làce que je fais c'est que je déclare une variable qui est égale à 1, 2, 3. On passe ensuite la
00:04:25 :référence de cet objet à notre fonction, plus particulièrement à ce paramètre param. Ensuiteparam ici qu'est ce que je fais ? Eh bien je fais une copie de cette liste dans une nouvelle variable
00:04:35 :donc on copie la liste et on aura donc un objet différent qui va avoir exactement les mêmesvaleurs que l'objet de base donc dans ce cas-ci 1, 2, 3. Ensuite on modifie test, on lui ajoute 4,
00:04:45 :on affiche test et donc là si je sauvegarde et que je relance le script on a bien 1, 2, 3, 4 dans lafonction et en dehors de la fonction on a bien 1, 2, 3 donc on n'a pas modifié notre variable endehors de la fonction puisqu'on a fait une copie de cet objet qu'on a mis dans une nouvelle variable
00:05:00 :et donc on n'a pas touché à l'objet d'origine. Donc voilà pour ces précisions on est dans desconcepts un petit peu plus avancés ici, n'hésitez pas à revoir cette vidéo c'est quand même trèsimportant de bien comprendre tout ça ici. En fait on revient à cette notion de Python qu'on a d'un
00:05:14 :côté des objets, de l'autre côté on a des noms et on peut avoir plusieurs noms qui pointent versle même objet et donc logiquement quand on modifie cet objet unique en mémoire on peut se retrouveravec différentes variables qui vont être modifiées. Donc il faut vraiment bien comprendre cette notion
00:05:29 :d'objet et de nom donc c'est très important de comprendre ces notions et de voir à quel point çapeut nous affecter si on ne les manipule pas de la bonne façon avec cette notion également d'objetsmuables et immuables. Donc forcément là encore quand vous êtes avec un objet immuable vous êtes
Ce n'est pas fini...
✋
Tu as complété % du parcours 🔥
Termine l'intégralité de la formation pour pouvoir débloquer ton attestation de réussite.