{"id":4695,"date":"2012-06-21T17:45:43","date_gmt":"2012-06-21T21:45:43","guid":{"rendered":"http:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=4695"},"modified":"2013-08-07T19:49:43","modified_gmt":"2013-08-07T23:49:43","slug":"17-fr","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/17-fr\/","title":{"rendered":"17: Is"},"content":{"rendered":"<!-- Please retain this notice and add more notes if you create a new version.<br \/>\nMain French translator: Brice Canvel, brice.canvel@gmail.com<br \/>\nOriginal lesson author: David Pritchard, daveagp@gmail.com<br \/>\nLicense: http:\/\/creativecommons.org\/licenses\/by-nc-sa\/3.0\/<br \/>\nFor the full site, visit http:\/\/cscircles.ca-->\n<p>Dans cette le\u00e7on, nous donnons plus de d\u00e9tails sur la fa\u00e7on dont les listes sont stock\u00e9es Python. Copier et comparer les listes peuvent avoir des cons\u00e9quences inattendues. Nous allons expliquer comment Python fonctionne en interne \u00e0 ce niveau, afin de comprendre et \u00e9viter les erreurs. Le point cl\u00e9 est que plusieurs variables peuvent \"pointer\" ou \"partager\" la m\u00eame liste. Vers la fin de la le\u00e7on, nous d\u00e9crivons l'op\u00e9rateur \"<code>is<\/code>\" qui indique si deux variables pointent <em>vraiment<\/em> exactement vers la m\u00eame liste.<\/p>\n<h1>Exemple<\/h1>\n<p><!-- ICI je parlerai plut\u00f4t de oldUnit newUnit que size . . mais bon c'est du python :) --><\/p>\n<p>Disons que nous voulons cr\u00e9er un fragment de code pour convertir une liste de longueurs exprim\u00e9es en pouces appel\u00e9e <code>tailleOriginale<\/code>, en une liste de m\u00eame longueur, mais en centim\u00e8tres appel\u00e9e <code>tailleConvertie<\/code>. La fa\u00e7on la plus naturelle de faire est d'utiliser la ligne <code>tailleConvertie = tailleOriginale<\/code> pour faire une copie, et ensuite passer en revue et modifier toutes les valeurs:<\/p>\n<pre>tailleOriginale = [\"lettre\", 8.5, 11]          # format de papier en pouces\r\ntailleConvertie = tailleOriginale              # faire une copie\r\ntailleConvertie[1] = tailleConvertie[1] * 2.54 # convertir en cm\r\ntailleConvertie[2] = tailleConvertie[2] * 2.54 # convertir en cm<\/pre>Maintenant, nous allons voir si cela fonctionne r\u00e9ellement. Si vous imprimez <code>tailleConvertie<\/code>\u00a0alors il donne <code>[\"lettre\", 21,59, 27,94]<\/code> comme pr\u00e9vu. Mais il y a une grosse surprise si vous aussi imprimer <code>tailleOriginale<\/code>: les valeurs de <code>tailleOriginale<\/code> ont chang\u00e9! Nous illustrons cel\u00e0 ci-dessous:<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform0\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox0'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>La deuxi\u00e8me ligne de sortie n'est pas ce que nous attendons <div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 162px;'><textarea wrap='off' name='usercode0' id='usercode0'  cols=10 rows=6 readonly='readonly'  style = 'height : 162px;'  class='pyboxCode RO'>\ntailleOriginale = [\"lettre\", 8.5, 11]          # format de papier en pouces\ntailleConvertie = tailleOriginale              # faire une copie\ntailleConvertie[1] = tailleConvertie[1] * 2.54 # convertir en cm\ntailleConvertie[2] = tailleConvertie[2] * 2.54 # convertir en cm\nprint(tailleConvertie)            # comme prevu [\"lettre\", 21.59, 27.94]\nprint(tailleOriginale)            # pas comme prevu! les nombres ont change<\/textarea><\/div>\n<div id='pbhistory0' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit0' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(0)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(0,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse0\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"0\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"e31792c16c8ebdf117b1ffccef971e9e\"\/>\n<div id='pbresults0' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit0\").value = \"Run program\";document.getElementById(\"inputInUse0\").value = \"N\";<\/script>\n<\/p>\n<p>Nous allons maintenant donner une explication d\u00e9taill\u00e9e de ce qui s'est pass\u00e9, en utilisant des diagrammes. Le principal probl\u00e8me est que <code>tailleConvertie = tailleOriginale<\/code> n'a pas vraiment copi\u00e9 toute la liste: il a simplement copi\u00e9 une <em>r\u00e9f\u00e9rence<\/em> (fl\u00e8che) \u00e0 cette liste.<\/p>\n<p><em>Cliquez sur les titres des diapositives de changer les onglets.<\/em><\/p>\n<div class=\"accordion\"><div class='collapseContain showing'>\n<div class='collapseHead'><span class='icon'><\/span>\nM\u00e9moire\n<\/div>\n<div class='collapseBody'>Nous allons utiliser une table pour repr\u00e9senter les variables et les valeurs dans la m\u00e9moire de Python. Par exemple, apr\u00e8s l'ex\u00e9cution du code<\/p>\n<pre>ville = \"Moose Factory\"\r\npopulation = 2458\r\nemployeur = ville<\/pre>ce tableau (avec une bordure noire) montre que la m\u00e9moire Python ressemble \u00e0 ceci:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" alt=\"\" src=\"..\/wp-content\/lesson_files\/img\/17\/slide1-fr.png\" width=\"480\" height=\"168\" \/>\u00a0<br\/>Le nom de la premi\u00e8re variable est la <code>ville<\/code>\u00a0et sa valeur est la cha\u00eene <code>\"Moose Factory\"<\/code>. Le nom de la deuxi\u00e8me variable est la <code>population<\/code> et sa valeur est l'entier <code>2458<\/code>. Le nom de la troisi\u00e8me variable est l'<code>employeur<\/code>\u00a0et sa valeur est la cha\u00eene <code>\"Moose Factory\"<\/code>, la valeur de <code>ville<\/code>.<\/div><\/div><div class='collapseContain hiding'>\n<div class='collapseHead'><span class='icon'><\/span>\nLists en m\u00e9moire\n<\/div>\n<div class='collapseBody'>Ensuite, montrons \u00e0 quoi la <em>liste<\/em> ressemble en m\u00e9moire. Par exemple, prenons le fragment de code :<\/p>\n<pre>maListe = [\"Moose Factory\", 2458]<\/pre>Cela va juste cr\u00e9er une variable, nomm\u00e9e <code>maListe<\/code>. Une liste est cr\u00e9\u00e9e, et la valeur de <code>maListe<\/code> est \u00e9gale au \"pointeur\" ou \"lien\" \u00e0 cette liste. Nous repr\u00e9sentons la liste \u00e0 l'aide d'une bo\u00eete, et les valeurs des entr\u00e9es de la liste sont indiqu\u00e9es \u00e0 l'int\u00e9rieur de la bo\u00eete \u00e0 c\u00f4t\u00e9 de leurs indices correspondants. La liste est repr\u00e9sent\u00e9e en bleu.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" alt=\"\" src=\"..\/wp-content\/lesson_files\/img\/17\/slide2-fr.png\" width=\"702\" height=\"168\" \/><br\/>La fl\u00e8che indique que <code>maListe<\/code> fait r\u00e9f\u00e9rence \u00e0 cette nouvelle liste. L'\u00e9l\u00e9ment \u00e0 l'index 0 de la liste est la cha\u00eene <code>\"Moose Factory\"<\/code>, et l'\u00e9l\u00e9ment \u00e0 l'index 1 est le nombre entier <code>2458<\/code>. Par exemple, si <code>maListe[1]<\/code>\u00a0est affich\u00e9, alors Python va afficher <code>2458<\/code>.<\/div><\/div><div class='collapseContain hiding'>\n<div class='collapseHead'><span class='icon'><\/span>\nRemplacement d'une valeur de la liste\n<\/div>\n<div class='collapseBody'>Maintenant, ajoutons une ligne de plus \u00e0 l'exemple pr\u00e9c\u00e9dent, ceci \u00e0 titre d'illustration. Disons qu'un b\u00e9b\u00e9 est n\u00e9, alors ex\u00e9cutons le fragment de code<\/p>\n<pre>maListe = [\"Moose Factory\", 2458]\r\nmaListe[1] = maListe[1] + 1<\/pre>Python calcule <code>2458 + 1<\/code>, soit <code>2459<\/code>, ce qui remplace la valeur \u00e0 l'index 1 de la liste. Apr\u00e8s la mise \u00e0 jour, nous avons le sch\u00e9ma ci-dessous :<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" alt=\"\" src=\"..\/wp-content\/lesson_files\/img\/17\/slide3-fr.png\" width=\"702\" height=\"168\" \/><br\/>(La barre <span style=\"text-decoration: line-through;\">2458<\/span> ne fait pas partie de la m\u00e9moire de Python, il est seulement indiqu\u00e9 pour souligner le changement.)<\/div><\/div><div class='collapseContain hiding'>\n<div class='collapseHead'><span class='icon'><\/span>\n<code>tailleOriginale<\/code> et <code>tailleConvertie<\/code>\n<\/div>\n<div class='collapseBody'>Revenons \u00e0 l'exemple principal. La premi\u00e8re ligne \u00e9tait<\/p>\n<pre>tailleOriginale = [\"lettre\", 8.5, 11]<\/pre>et la m\u00e9moire Python ressemble \u00e0 la figure ci-dessous apr\u00e8s que cette ligne soit ex\u00e9cut\u00e9e. Nous avons cr\u00e9\u00e9 une liste de longueur 3.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" alt=\"\" src=\"..\/wp-content\/lesson_files\/img\/17\/slide4-fr.png\" width=\"702\" height=\"168\" \/><\/div><\/div><div class='collapseContain hiding'>\n<div class='collapseHead'><span class='icon'><\/span>\nLe probl\u00e8me principal\n<\/div>\n<div class='collapseBody'>Dans notre programme, la deuxi\u00e8me ligne est<\/p>\n<pre>tailleConvertie = tailleOriginale<\/pre>et nous voil\u00e0 devant le point cl\u00e9 : \u00e0 la deuxi\u00e8me ligne, <strong><code>=<\/code> ne duplique pas la liste<\/strong>. Au lieu de cela,une nouvelle r\u00e9f\u00e9rence \u00e0 la <strong>m\u00eame<\/strong> liste a \u00e9t\u00e9 copi\u00e9e. Ceci est illustr\u00e9 par deux fl\u00e8ches diff\u00e9rentes pointant vers la m\u00eame bo\u00eete de. C'est tout \u00e0 fait diff\u00e9rent de copier les num\u00e9ros ou les cha\u00eenes (comme dans la premi\u00e8re diapositive). <img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" alt=\"\" src=\"..\/wp-content\/lesson_files\/img\/17\/slide5-fr.png\" width=\"702\" height=\"168\" \/><br\/>Comme le montre le sch\u00e9ma, nous avons deux variables, qui font toutes deux r\u00e9f\u00e9rence \u00e0 la m\u00eame liste.<\/div><\/div><div class='collapseContain hiding'>\n<div class='collapseHead'><span class='icon'><\/span>\nMise \u00e0 jour\n<\/div>\n<div class='collapseBody'>Ensuite, lorsque le programme atteint la ligne<\/p>\n<pre>tailleConvertie[1] = tailleOriginale[1]*2.54<\/pre>Python consid\u00e8re <code>tailleConvertie<\/code>, regarde la valeur d'indice 1 (<code>8.5<\/code>) et le multiplie par <code>2.54<\/code>, puis remplace la valeur, comme illustr\u00e9. Toutefois, \u00e9tant donn\u00e9 que <code>tailleOriginale<\/code> r\u00e9f\u00e9rence la m\u00eame liste, un effet secondaire est que nous avons perturb\u00e9 <code>tailleOriginale<\/code>!<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" alt=\"\" src=\"..\/wp-content\/lesson_files\/img\/17\/slide6-fr.png\" width=\"702\" height=\"168\" \/>\u00a0<br\/>(Encore une fois <span style=\"text-decoration: line-through;\">8.5<\/span> est repr\u00e9sent\u00e9 ici pour souligner le changement.)<br \/>\n<\/div><\/div><div class='collapseContain hiding'>\n<div class='collapseHead'><span class='icon'><\/span>\nR\u00e9sultat\n<\/div>\n<div class='collapseBody'>La ligne suivante est similaire,<\/p>\n<pre>tailleConvertie[2] = tailleConvertie[2]*2.54<\/pre>qui affecte l'autre valeur de la liste. Apr\u00e8s l'\u00e9xecution de cette ligne, la m\u00e9moire Python ressemble au sch\u00e9ma ci-dessous.<br\/><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" alt=\"\" src=\"..\/wp-content\/lesson_files\/img\/17\/slide7-fr.png\" width=\"702\" height=\"168\" \/>\u00a0<br\/>Maintenant quand nous imprimons soit <code>tailleConvertie<\/code>\u00a0<strong>soit<\/strong> <code>tailleOriginale<\/code>, Python affiche <code>[\"lettre\", 21.59, 27.94]<\/code>.<br \/>\n<\/div><\/div><\/div><br \/>\n<table class='pywarn'><tr><td class='pywarnleft'><img src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/warning.png'\/><\/td><td class='pywarnright'><span> Une autre fa\u00e7on de regarder cet exemple est de l'ex\u00e9cuter \u00e0 travers l'outil de <a href=\"\/visualize\">visualisation<\/a>. Si vous faites cela, au lieu de fl\u00e8ches, vous remarquerez que les listes sont nomm\u00e9es par leur \"ID\". Chaque liste existe en fait \u00e0 une \u00abadresse\u00bb \u00e9gale \u00e0 son identit\u00e9; une valeur d'adresse est comme une fl\u00e8che pointant vers la bo\u00eete \u00e0 cette adresse ID. <\/span><\/td><\/table><\/p>\n<h1>Comment copier correctement une liste en Python<\/h1>\n<p>Bien qu'il soit <a class=\"hintlink\"  id=\"hintlink1\"> parfois utile<\/a> d'avoir de multiples r\u00e9f\u00e9rences \u00e0 la m\u00eame liste, ici ce n'est pas ce que nous voulions.<\/p>\n<p>Nous allons vous donner trois solutions. Elles sont toutes \u00e0 peu pr\u00e8s \u00e9quivalentes, mais chacune d'elle va nous apprendre un fait nouveau sur Python, donc les trois m\u00e9ritent d'\u00eatre lues.<\/p>\n<h2>M\u00e9thode 1, en utilisant <code>[:]<\/code><\/h2>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform2\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox2'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Copiage avec <code>[:]<\/code><div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 110px;'><textarea wrap='off' name='usercode2' id='usercode2'  cols=10 rows=4 readonly='readonly'  style = 'height : 110px;'  class='pyboxCode RO'>\nlisteOriginale = [\"premier\", \"deuxieme\", \"troisieme\"]\nlisteCopiee = listeOriginale[:] # cr\u00e9er une copie\nlisteOriginale.reverse()\nprint(listeCopiee, listeOriginale)<\/textarea><\/div>\n<div id='pbhistory2' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit2' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(2)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(2,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse2\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"2\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"3cd9ada9f7e4c6e23447c4de20c31541\"\/>\n<div id='pbresults2' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit2\").value = \"Run program\";document.getElementById(\"inputInUse2\").value = \"N\";<\/script>\n<\/p>\n<p>Ci-dessus, nous d\u00e9montrons que <code>listeCopiee = listeOriginale[:]<\/code>\u00a0cr\u00e9e une vraie copie de l'ancienne liste. Bien que cette syntaxe semble \u00e9trange, elle est en relation avec quelque chose que nous avons d\u00e9j\u00e0 vu. Dans la <a href=\"\/7a-fr\/\">le\u00e7on sur les cha\u00eenes<\/a>, nous avons introduit une fa\u00e7on d'extraire une sous-cha\u00eene: <code>chaine[premier:arriere]<\/code> renvoie la sous-cha\u00eene commen\u00e7ant par l'indice\u00a0<code>premier<\/code>\u00a0et se terminant avec un indice <code>arriere-1<\/code>. Nous avons mentionn\u00e9 que cela peut \u00e9galement s'appliquer \u00e0 la cr\u00e9ation de sous-listes de listes. En outre,<\/p>\n<ul>\n<li>si vous omettez <code>premier<\/code>, alors il prend la valeur par d\u00e9faut <code>0<\/code>;<\/li>\n<li>si vous omettez <code>arriere<\/code>, alors il prend la valeur par d\u00e9faut <code>len<\/code> (la longueur de la liste ou cha\u00eene).<\/li>\n<\/ul>\n<p>Alors ce qui se passe r\u00e9ellement, c'est que <code>listOriginale[:]<\/code> est la cr\u00e9ation d'une sous-liste, mais contenant toutes les donn\u00e9es de la liste originale, c'est donc une nouvelle copie.<\/p>\n<h2>M\u00e9thode 2, en utilisant <code>copy.copy()<\/code><\/h2>\n<p>Il existe un module appel\u00e9 <code>copy<\/code>, qui contient plusieurs m\u00e9thodes li\u00e9es au copiage. Le plus simple est <code>copy.copy(L)<\/code>, qui lorsque vous appelez cela sur une liste <code>L<\/code>, retourne une copie r\u00e9elle de <code>L<\/code>.<br \/>\n<form class=\"pbform\" action=\"#\" id=\"pbform3\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox3'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div> Copiage avec\u00a0<code>copy.copy<\/code><div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 136px;'><textarea wrap='off' name='usercode3' id='usercode3'  cols=10 rows=5 readonly='readonly'  style = 'height : 136px;'  class='pyboxCode RO'>\nimport copy\nlisteOriginale = [\"premier\", \"deuxieme\", \"troisieme\"]\nlisteCopiee = copy.copy(listeOriginale)     # cr\u00e9e une copie \nlisteOriginale.reverse()\nprint(listeCopiee, listeOriginale)<\/textarea><\/div>\n<div id='pbhistory3' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit3' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(3)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(3,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse3\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"3\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"2cad19ee2306a2dfb367ebd6442f95f8\"\/>\n<div id='pbresults3' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit3\").value = \"Run program\";document.getElementById(\"inputInUse3\").value = \"N\";<\/script>\n<\/p>\n<p>Le <code>copy.copy()<\/code> fonctionne aussi pour d'autres types d'objets, mais nous n'en discuterons pas ici.<\/p>\n<h2>M\u00e9thode 3, en utilisant\u00a0<code>list()<\/code><\/h2>\n<p>Le dernier moyen de faire une vraie copie utilise la fonction <code>list()<\/code>. Ordinairement, <code>list()<\/code> est utilis\u00e9 pour convertir les donn\u00e9es d'autres types en listes. (Par exemple <code>list(\"salut\")<\/code> <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/console\/?consolecode=L%20%3D%20list%28%27salut%27%29%0Aprint%28type%28L%29%29%0Aprint%28L%29%0Aprint%28L%5B0%5D%29%0Aprint%28type%28L%5B0%5D%29%29\" target=\"_blank\">convertit<\/a> la cha\u00eene \"salut\" en une liste de 5 \u00e9l\u00e9ments, chaque element \u00e9tant un character.) Mais si vous tentez de convertir quelque chose qui est d\u00e9j\u00e0 une liste en une liste, cela donne tout simplement une copie.<form class=\"pbform\" action=\"#\" id=\"pbform4\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox4'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Copiage avec\u00a0<code>list()<\/code><div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 110px;'><textarea wrap='off' name='usercode4' id='usercode4'  cols=10 rows=4 readonly='readonly'  style = 'height : 110px;'  class='pyboxCode RO'>\nlisteOriginale = [\"premier\", \"deuxieme\", \"troisieme\"]\nlisteCopiee = list(listeOriginale)     # cr\u00e9e une copie \nlisteOriginale.reverse()\nprint(listeCopiee, listeOriginale)<\/textarea><\/div>\n<div id='pbhistory4' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit4' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(4)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(4,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse4\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"4\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"7633949b47125d2f817c1341d6590892\"\/>\n<div id='pbresults4' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit4\").value = \"Run program\";document.getElementById(\"inputInUse4\").value = \"N\";<\/script>\n<\/p>\n<h2>Les listes comme arguments<\/h2>\n<p>Notez qu'en raison de la fa\u00e7on dont les listes sont manipul\u00e9es, une fonction qui accepte une liste d'argument peut r\u00e9ellement changer le contenu de la liste. (Vous avez vu ce d\u00e9j\u00e0 dans l'exercice <code><a href=\"\/14-fr\/\">remplace<\/a><\/code>.)<\/p>\n<p><div class='pybox modeNeutral' id='pybox5'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Short Answer Exercise: <\/span><span class='title'>Argument de liste<\/span><\/div> Quel nombre est affich\u00e9 par le programme suivant ?<\/p>\n<pre>def fonc(liste):\r\n  \u00a0 liste[0] = liste[0] + liste[1]\r\n  \u00a0 liste[1] = liste[1] + liste[0]\r\ndata = [3, 4]\r\nfonc(data)\r\nprint(data[0]*data[1])<\/pre><label for=\"pyShortAnswer5\">Your answer (enter a number): <\/label><input type=\"text\" onkeypress=\"{if (event.keyCode==13) pbShortCheck(5)}\" id=\"pyShortAnswer5\"><div class=\"pyboxbuttons\"><input type=\"hidden\" name=\"type\" value=\"number\"\/><input type=\"hidden\" name=\"correct\" value=\"77\"\/><input type=\"hidden\" name=\"slug\" value=\"17.reference\"\/><input type=\"hidden\" name=\"lang\" value=\"\"\/><input type='submit' style='margin:5px;' value='Check answer' onClick = 'pbShortCheck(5)'\/><\/div><div class=\"pbresults\" id=\"pyShortResults5\"><\/div><div class=\"epilogue\">Correct ! Dedans <code>fonc<\/code>, nous changeons la valeur \u00e0 l'indice 0 \u00e0 7, et la valeur \u00e0 l'indice 1 \u00e0 7+4=11. Alors nous avons la sortie 7*11.<\/div><\/div>\n<h2>Comparaison de listes en utilisant <code>is<\/code><\/h2>\n<p>Quand deux variables de liste <code>L1<\/code> et <code>L2<\/code> sont elle \u00e9gales? Il a deux fa\u00e7ons d'interpr\u00e9ter cette question :<\/p>\n<ul>\n<li><em>M\u00eame identit\u00e9<\/em>: Est-ce que <code>L1<\/code> et <code>L2<\/code> pointent ou se r\u00e9f\u00e8rent au m\u00eame objet m\u00e9moire de type liste?<\/li>\n<li><em>M\u00eames valeurs<\/em>:\u00a0Est-ce que le contenu de la liste <code>L1<\/code> est \u00e9gal au contenu de la liste <code>L2<\/code>?<\/li>\n<\/ul>\n<p>Il se trouve que, en Python, l'op\u00e9rateur d'\u00e9galit\u00e9 standard <code>==<\/code> a le sens de <em>M\u00eames valeurs<\/em>, comme le montre l'exemple ci dessous.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform6\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox6'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div> Le sens de <code>==<\/code><div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 84px;'><textarea wrap='off' name='usercode6' id='usercode6'  cols=10 rows=3 readonly='readonly'  style = 'height : 84px;'  class='pyboxCode RO'>\nL1 = ['texte', 11]\nL2 = L1[:]        # fait une copie \nprint(L1 == L2)   # m\u00eames valeurs?<\/textarea><\/div>\n<div id='pbhistory6' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit6' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(6)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(6,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse6\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"6\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"70fffb3dbc33bb10b3743faf2fd57132\"\/>\n<div id='pbresults6' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit6\").value = \"Run program\";document.getElementById(\"inputInUse6\").value = \"N\";<\/script>\n<\/p>\n<p>Pour tester le cas de <em>M\u00eame identit\u00e9<\/em>, Python a l'op\u00e9rateur <code>is<\/code>. Il s'utilise la m\u00eame mani\u00e8re que <code>==<\/code>: la syntaxe<\/p>\n<p style=\"text-align: center;\"><code>\u00ablist1\u00bb is\u00a0\u00ablist2\u00bb<\/code><\/p>\n<p>renvoie <code>True<\/code> si les listes pointent vers la m\u00eame liste, et <code>False<\/code>\u00a0si elle pointent vers des listes diff\u00e9rentes (m\u00eame si elles ont un contenu identique).<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform7\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox7'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Le sens de\u00a0<code>is<\/code><div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 162px;'><textarea wrap='off' name='usercode7' id='usercode7'  cols=10 rows=6 readonly='readonly'  style = 'height : 162px;'  class='pyboxCode RO'>\nL = ['texte', 11]\nLEncore = L               # une autre r\u00e9f\u00e9rence \u00e0 L\nprint(LEncore is L)       # m\u00eame identit\u00e9? oui\nLCopiee = L[:]            # faire une copie\nprint(LCopiee == LEncore) # m\u00eames valeurs? oui: les deux sont ['texte', 11]\nprint(LCopiee is LEncore) # m\u00eame identit\u00e9? non: LEncore est L, LCopiee ne l'est<\/textarea><\/div>\n<div id='pbhistory7' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit7' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(7)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(7,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse7\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"7\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"53c5852dcdb1f86a0f9aad2f0b000b9a\"\/>\n<div id='pbresults7' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit7\").value = \"Run program\";document.getElementById(\"inputInUse7\").value = \"N\";<\/script>\n<\/p>\n<p><div class='pybox modeNeutral' id='pybox8'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Short Answer Exercise: <\/span><span class='title'>Compte exact<\/span><\/div> Combien de fois la valeur\u00a0<code>True<\/code>\u00a0s'affiche dans ce programme? (Faites un sch\u00e9ma pour suivre la trace du calcul)<\/p>\n<pre>liste1 = [9, 1, 1]\r\nliste3 = list(liste1)\r\nliste2 = liste1\r\nliste4 = liste3[:]\r\nliste1[0] = 4\r\nliste5 = liste1\r\nprint(liste1 is liste2, liste2 is liste3, liste3 is liste4, liste4 is liste5)\r\nprint(liste1 == liste2, liste2 == liste3, liste3 == liste4, liste4 == liste5)<\/pre><label for=\"pyShortAnswer8\">Your answer (enter a number): <\/label><input type=\"text\" onkeypress=\"{if (event.keyCode==13) pbShortCheck(8)}\" id=\"pyShortAnswer8\"><div class=\"pyboxbuttons\"><input type=\"hidden\" name=\"type\" value=\"number\"\/><input type=\"hidden\" name=\"correct\" value=\"3\"\/><input type=\"hidden\" name=\"slug\" value=\"17.is\"\/><input type=\"hidden\" name=\"lang\" value=\"\"\/><input type='submit' style='margin:5px;' value='Check answer' onClick = 'pbShortCheck(8)'\/><\/div><div class=\"pbresults\" id=\"pyShortResults8\"><\/div><div class=\"epilogue\">Correct! The output is\r\n<code>\r\nTrue False False False<\/code>\r\n\r\nTrue False True False<\/div><\/div>\n<p><table class='pywarn'><tr><td class='pywarnleft'><img src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/warning.png'\/><\/td><td class='pywarnright'><span> Il ne faut pas utiliser\u00a0<code>is<\/code>\u00a0avec des cha\u00eenes ou des nombres car == teste d\u00e9j\u00e0 l'\u00e9galit\u00e9, et le comportement de\u00a0<code>is<\/code>\u00a0est <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/console\/?consolecode=%23%20pourquoi%20%22is%22%20est-il%20difficile%20pour%20chaines%3F%0Aprint%28%22foo%22%20is%20%22foo%22%2C%20%22foo%22%20is%20%22fo%22%2B%22o%22%29%20%23%20deux%20True%2C%20du%20a%20%22interning%22%0Aprint%28%22e%22%2A32%20is%20%22ee%22%2A16%29%20%23%20False%2C%20chaines%20longues%20ne%20sont%20pas%20internes%0AA%20%3D%20%22foo%22%0AB%20%3D%20%22foofoo%22%0AA%20%2A%3D%202%0Aprint%28A%20%3D%3D%20B%2C%20A%20is%20B%29%20%23%20True%20False%3A%20%2A%3D%20ne%20re-interne%20pas%20un%20chaine%0A%0A%23%20pourquoi%20%22is%22%20est-il%20difficile%20pour%20nombres%3F%0Aprint%281%2B1%20is%202%29%20%23%20True%2C%20mais%20seulment%20pour%20les%20nombres%20petits%0Aprint%2810%2A%2A3%20is%201000%29%20%23%20False%0Aprint%281.5%20is%201.5%2C%201.5%20is%200.5%2A3%29%20%23%20True%2C%20False%0Aprint%28float%28%27NaN%27%29%3D%3Dfloat%28%27NaN%27%29%2C%20float%28%27NaN%27%29%20is%20float%28%27NaN%27%29%29%20%23%20deux%20False%0Ax%20%3D%20float%28%27NaN%27%29%0Aprint%28x%20is%20x%2C%20x%20%3D%3D%20x%29%20%23%20True%20False%3B%20peu%20de%20cas%20ont%20%27is%27T%2C%20%3D%3DF%0Aprint%280.0%20is%200%2C%200.0%20%3D%3D%200%29%20%23%20False%20True%0A%0A%23%20en%20outre%2C%20%22is%22%20fait%20plus%20que%20comparer%20id%28%29%3A%20http%3A%2F%2Fcodepad.org%2FXb0TaKl9%0A%0A\" target=\"_blank\">difficile \u00e0 pr\u00e9dire<\/a> avec des cha\u00eenes ou des nombres. <\/span><\/td><\/table><\/p>\n<h2>Listes imbriqu\u00e9es<\/h2>\n<p>Nous avons d\u00e9j\u00e0 vu la plupart des informations importantes, mais il y a une autre situation usuelle qui est digne d'attention. Une <em>liste imbriqu\u00e9e <\/em>est une liste dont les valeurs sont elle-m\u00eames une liste, par exemple<\/p>\n<p style=\"text-align: center;\"><code>exemple = [365.25, [\"premier\", 5]]<\/code><\/p>\n<p>montre une liste imbriqu\u00e9e. La <em>liste externe,<\/em>\u00a0vers laquelle pointe <code>sample<\/code>, a deux \u00e9l\u00e9ments; l'\u00e9l\u00e9ment \u00e0 l'index 0 est une nombre flottant et l'\u00e9l\u00e9ment l'index 1 est une <em>liste interne<\/em>. Cette liste interne est <code>[\"premier\", 5]<\/code>. (Il peut y avoir plus de niveaux d'imbrication, bien entendu.) Lors de l'utilisation des listes imbriqu\u00e9es, gardez \u00e0 l'esprit que :<\/p>\n<ul>\n<li>L'application des trois m\u00e9thodes ci-dessus \u00e0 <code>exemple<\/code> ne copierar que la liste externe, mais non la liste interne. Ainsi <code>copy(exemple)[1] is exemple[1]<\/code>, signifie que la copie a toujours une r\u00e9f\u00e9rence vers une partie de la liste originale. Ce n'est probablement pas ce que vous souhaitez. C'est la m\u00e9thode <code>copy.deepcopy()<\/code> qui effectue la copie \u00e0 tous les niveaux d'imbrication.<\/li>\n<li>Tester des listes avec l'op\u00e9rateur <code>==<\/code> est intuitif: Python applique r\u00e9cursivement <code>==<\/code> sur chaque \u00e9l\u00e9ment de la liste. Par exemple <code>[[1, 2], 3]==[[1, 2], 3]<\/code> a la valeur <code>True<\/code>, et <code>[[1, 2], 3]==[1, 2, 3]<\/code> a la valeur <code>False<\/code> puisque les premiers \u00e9l\u00e9ments sont diff\u00e9rents (<code>[1, 2] != 1<\/code>).<\/li>\n<\/ul>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform9\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox9'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div><code>deepcopy<\/code> et l'\u00e9galit\u00e9 r\u00e9cursive<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 266px;'><textarea wrap='off' name='usercode9' id='usercode9'  cols=10 rows=10 readonly='readonly'  style = 'height : 266px;'  class='pyboxCode RO'>\nimport copy\nexemple = [365.25, [\"premier\", 5]]\nclone = copy.copy(exemple)\nprint(exemple, clone)\nprint(exemple == clone, exemple is clone)\nprint(exemple[1] == clone[1], exemple[1] is clone[1])\ncloneProfond = copy.deepcopy(exemple)\nprint(cloneProfond)\nprint(exemple == cloneProfond, exemple is cloneProfond)\nprint(exemple[1] == cloneProfond[1], exemple[1] is cloneProfond[1])<\/textarea><\/div>\n<div id='pbhistory9' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit9' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(9)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(9,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse9\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"9\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"64dfb38cebd8640034d974b3186dee79\"\/>\n<div id='pbresults9' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit9\").value = \"Run program\";document.getElementById(\"inputInUse9\").value = \"N\";<\/script>\n<\/p>\n<p>Vous avez maintenant termin\u00e9 cette le\u00e7on! Le mat\u00e9riel suppl\u00e9mentaire suivant est facultatif.<\/p>\n<hr \/>\n<h2>Tuples: <code>(\"listes\", \"immuables\")<\/code><\/h2>\n<p>Nous avons mentionn\u00e9 ci-dessus que lorsque vous appelez une fonction sur une liste, il peut modifier la liste. Parfois, vous voulez rendre cela impossible! Une solution en Python est de cr\u00e9er des <em>tuples<\/em>, qui sont les m\u00eames objets que les listes, sauf qu'ils ne peuvent jamais \u00eatre chang\u00e9. Nous disons que les listes sont <em>mutables<\/em>\u00a0et les tuples sont <em>immuables<\/em>. (Les cha\u00eenes et les nombres sont \u00e9galement immuables.) Cela peut \u00eatre un moyen utile pour \u00e9viter toute erreur de programmation, de se pr\u00e9munir contre la modification intenpestive de listes. Les tuples sont presque identiques aux listes, sauf qu'ils utilisent des parenth\u00e8ses rondes <code>()<\/code> au lieu de crochets <code>[]<\/code>. Vous pouvez convertir des tuples et des listes \u00e0 l'aide de la construction <code>tuple()<\/code> et <code>list()<\/code>.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform10\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox10'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Tuples tubulaires<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 188px;'><textarea wrap='off' name='usercode10' id='usercode10'  cols=10 rows=7 readonly='readonly'  style = 'height : 188px;'  class='pyboxCode RO'>\nT = (3, 4, 5)\nprint(T)\nprint(type(T))           # tuple\nprint(T[0])              # le premier \u00e9l\u00e9ment du tuple\nprint(list(T))           # conversion d'un tuple \u00e0 une liste\nprint(tuple([1, 2, 3]))  # conversion d'une liste \u00e0 un tuple\nT[0] = \"trois\"           # Erreur! On ne peut pas modifier valeurs des tuples<\/textarea><\/div>\n<div id='pbhistory10' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit10' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(10)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(10,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse10\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"10\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"1205f33ef1e826173554d21b7c40a0da\"\/>\n<div id='pbresults10' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit10\").value = \"Run program\";document.getElementById(\"inputInUse10\").value = \"N\";<\/script>\n<\/p>\n<h2>Vers\u00a0<code>\u221e<\/code> et au-del\u00e0: Auto-confinement<\/h2>\n<p>Il est possible d'avoir une liste qui se contient elle-m\u00eame ! Il suffit de faire une liste, puis rediriger un de ses \u00e9l\u00e9ments pour qu'il pointe vers la liste elle-m\u00eame :<br \/>\n<form class=\"pbform\" action=\"#\" id=\"pbform11\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox11'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Une r\u00e9f\u00e9rence circulaire<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 136px;'><textarea wrap='off' name='usercode11' id='usercode11'  cols=10 rows=5 readonly='readonly'  style = 'height : 136px;'  class='pyboxCode RO'>\nL = [\"zero\", \"un\"]\nL[1] = L\nprint(len(L))\nprint(L)\nprint(L is L[1])<\/textarea><\/div>\n<div id='pbhistory11' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit11' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(11)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(11,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse11\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"11\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"4eae5b6d4b7a43ae87e179c7d34e7f8c\"\/>\n<div id='pbresults11' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit11\").value = \"Run program\";document.getElementById(\"inputInUse11\").value = \"N\";<\/script>\n<\/p>\n<p>Notez que la sortie du moteur Python est assez intelligent pour reconna\u00eetre que la liste reboucle sur elle-m\u00eame: il affiche \"<code>...<\/code>\" au lieu de l'impression detout <code>L<\/code>, pour \u00e9viter une boucle infinie.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans cette le\u00e7on, nous donnons plus de d\u00e9tails sur la fa\u00e7on dont les listes sont stock\u00e9es Python. Copier et comparer les listes peuvent avoir des cons\u00e9quences inattendues. Nous allons expliquer comment Python fonctionne en interne \u00e0 ce niveau, afin de &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/17-fr\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-4695","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/4695","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/comments?post=4695"}],"version-history":[{"count":43,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/4695\/revisions"}],"predecessor-version":[{"id":7485,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/4695\/revisions\/7485"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=4695"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}