{"id":1379,"date":"2015-08-07T10:35:11","date_gmt":"2015-08-07T14:35:11","guid":{"rendered":"http:\/\/bioinfo.iric.ca\/?p=1379"},"modified":"2017-05-01T09:55:20","modified_gmt":"2017-05-01T13:55:20","slug":"parametres-mutables-par-default-en-python","status":"publish","type":"post","link":"https:\/\/bioinfo.iric.ca\/fr\/parametres-mutables-par-default-en-python\/","title":{"rendered":"Param\u00e8tres mutables par d\u00e9faut en Python"},"content":{"rendered":"<p>R\u00e9cemment, tout en d\u00e9bogant un morceau de code Python \u00e0 la plateforme, nous sommes tomb\u00e9s sur une particularit\u00e9 du langage Python.<\/p>\n<p>Prenons cette fonction comme exemple :<\/p>\n<pre class=\"prompt input_prompt\"><code><span style=\"color: #339966;\">def <span style=\"color: #3366ff;\">foo<\/span><\/span>(bar=[]): \u00a0 \u00a0 \r\n    bar.append<span style=\"color: #339966;\">(<\/span><span style=\"color: #ff0000;\">'a'<\/span><span style=\"color: #339966;\">)\r\n<\/span>    return bar<\/code><\/pre>\n<p>Intuitivement, ce morceau de code peut sembler retourner la\u00a0liste <code>[<span style=\"color: #993300;\">'a'<\/span>]<\/code>\u00a0\u00e0\u00a0chaque appel de la fonction <code>foo()<\/code>. Mais ce n&rsquo;est pas le cas:<\/p>\n<div class=\"input\">\n<pre class=\"prompt input_prompt\"><code>&gt;&gt;&gt;f<span class=\"cm-variable\">oo<\/span><span style=\"color: #339966;\"><span class=\" CodeMirror-matchingbracket\">(<\/span><span class=\" CodeMirror-matchingbracket\">)<\/span><\/span><\/code><\/pre>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\"CodeMirror cm-s-ipython\">\n<div class=\"CodeMirror-scroll\" tabindex=\"-1\" draggable=\"false\">\n<pre><code>[<span style=\"color: #ff0000;\">'a'<\/span>]<\/code><\/pre>\n<pre class=\"prompt input_prompt\"><code>&gt;&gt;&gt;f<span class=\"cm-variable\">oo<\/span><span style=\"color: #339966;\"><span class=\" CodeMirror-matchingbracket\">(<\/span><span class=\" CodeMirror-matchingbracket\">)\r\n<\/span><\/span><\/code><\/pre>\n<pre><code>[<span style=\"color: #993366;\"><span style=\"color: #ff0000;\">'a'<\/span><span style=\"color: #000000;\">,<\/span><\/span><span style=\"color: #ff0000;\">'a'<\/span>]<\/code><\/pre>\n<pre class=\"prompt input_prompt\"><code>&gt;&gt;&gt;f<span class=\"cm-variable\">oo<\/span><span style=\"color: #339966;\"><span class=\" CodeMirror-matchingbracket\">(<\/span><span class=\" CodeMirror-matchingbracket\">)\r\n<\/span><\/span><\/code><\/pre>\n<pre><code>[<span style=\"color: #ff0000;\">'a'<\/span>,<span style=\"color: #ff0000;\">'a'<\/span>,<span style=\"color: #ff0000;\">'a'<\/span>]<\/code><\/pre>\n<div class=\"cell text_cell rendered unselected\" tabindex=\"2\">\n<div class=\"inner_cell\">\n<div class=\"text_cell_render rendered_html\" tabindex=\"-1\">\n<p>Comme nous pouvons le constater, la liste n&rsquo;est pas r\u00e9initialis\u00e9e mais conserve plut\u00f4t ses valeurs auxquelles on ajoute un \u00ab\u00a0a\u00a0\u00bb \u00e0 chaque ex\u00e9cution . Ce comportement est li\u00e9 \u00e0 la mani\u00e8re dont Python g\u00e8re ces fonctions. Les\u00a0fonctions en Python sont initialis\u00e9es en tant qu&rsquo;objet. Les fonctions, ainsi que\u00a0leurs param\u00e8tres, sont\u00a0donc \u00e9valu\u00e9es\u00a0lorsqu&rsquo;elles sont d\u00e9finies et non lorsqu&rsquo;elles sont ex\u00e9cut\u00e9es.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>Noter que cette particularit\u00e9 ne s&rsquo;applique pas simplement aux listes. Tous les param\u00e8tres de type \u00ab\u00a0mutable\u00a0\u00bb dont les dictionnaires, <em>sets<\/em>, listes, <em>byte arrays<\/em> et m\u00eame les fonctions elles-m\u00eames auront ce comportement.<\/p>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\"CodeMirror cm-s-ipython\">\n<div class=\"CodeMirror-scroll\" tabindex=\"-1\" draggable=\"false\">\n<div class=\"cell text_cell rendered selected\" tabindex=\"2\">\n<div class=\"inner_cell\">\n<div class=\"text_cell_render rendered_html\" tabindex=\"-1\">\n<p>J&rsquo;avoue avoir \u00e9t\u00e9 surpris de n&rsquo;\u00eatre jamais tomb\u00e9 sur ceci bien que cette particularit\u00e9 soit mentionn\u00e9e comme une\u00a0<a href=\"http:\/\/docs.python-guide.org\/en\/latest\/writing\/gotchas\/\">erreur fr\u00e9quente en Python<\/a>. Il est possible que mon habitude d&rsquo;initialiser les param\u00e8tres par d\u00e9faut vides \u00e0 <code>None<\/code> (plut\u00f4t que d&rsquo;utiliser une liste vide par exemple) m&rsquo;ait\u00a0\u00e9viter de me trouver dans une\u00a0situation semblable.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>R\u00e9cemment, tout en d\u00e9bogant un morceau de code Python \u00e0 la plateforme, nous sommes tomb\u00e9s sur une particularit\u00e9 du langage Python. Prenons cette fonction comme exemple : def foo(bar=[]): \u00a0 \u00a0 bar.append(&lsquo;a&rsquo;) return bar Intuitivement, ce morceau de code peut sembler retourner la\u00a0liste [&lsquo;a&rsquo;]\u00a0\u00e0\u00a0chaque appel de la fonction foo(). Mais ce n&rsquo;est pas le cas: &gt;&gt;&gt;foo() [&lsquo;a&rsquo;] &gt;&gt;&gt;foo() [&lsquo;a&rsquo;,&rsquo;a&rsquo;] &gt;&gt;&gt;foo() [&lsquo;a&rsquo;,&rsquo;a&rsquo;,&rsquo;a&rsquo;] Comme nous pouvons le constater, la liste n&rsquo;est pas r\u00e9initialis\u00e9e mais conserve plut\u00f4t ses valeurs auxquelles on ajoute un <a href=\"https:\/\/bioinfo.iric.ca\/fr\/parametres-mutables-par-default-en-python\/\"> [&#8230;]<\/a><\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[26],"tags":[],"class_list":["post-1379","post","type-post","status-publish","format-standard","hentry","category-langage-python"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/1379","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/comments?post=1379"}],"version-history":[{"count":8,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/1379\/revisions"}],"predecessor-version":[{"id":3324,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/1379\/revisions\/3324"}],"wp:attachment":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/media?parent=1379"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/categories?post=1379"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/tags?post=1379"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}