En effet, dans le premier cas, c'est toujours le même objet (avec la même id) qui est placé dans la liste en compréhension ; dans le 2e code, à chaque insertion c'est une liste d'id différente qui est insérée.
- Edité par PascalOrtiz 20 novembre 2019 à 22:49:33
Effectivement chaque liste référence n fois la même sous liste. En fait a1 & a2 sont assignées par une opération sur une variable. Cette variable (tt) est assignée par une liste qui contient 2 éléments (0 &1). tt possède donc une id ainsi que les éléments qui la constituent.
a1 est assigné par une multiplication par n de tt. Selon la nature de tt (une liste) a1 sera une liste et a1 contiendra donc n fois la sous liste tt. a1 en tant que liste principale possède donc sa propre id et référence n fois l'id de tt et de ses éléments.
a2 est aussi une liste principale qui possède par conséquent sa propre id, mais contrairement à a1, elle est assignée (sous la forme d'une liste en compréhension) par tt dans une boucle for ; ce qui entraîne une réévaluation de l'élément à traiter. tt est donc réévalué n fois comme étant tt avec sa propre id et celles des éléments qui la composent. Quel que soit le processus d'assignation choisi, a1 & a2 référencent donc obligatoirement toutes les deux les id de tt, que tt soit copiée (ou concaténée), ou réévalué.
a3 est, comme a1, assignée par une multiplication par n, mais contrairement à a1, l'assignation s'effectue sur une liste décrite littéralement ([0,1]). Comme pour tt ses éléments (identiques pour les 2 listes (tt & [0,1])) possède l'id qui a été défini pour 0 & pour 1. Comme pour la liste tt une id est donnée à la liste [0,1]. Et cette id est donc référencée n fois dans la liste a3.
Mais contrairement à tt cette id est redéfini à chaque réassignation, même si par exemple on réassigne a3 avec la même liste ([0,1]). Et bien évidemment les id de a1 & a3 sont redéfinies à chaque nouvelle assignation.
Pour b1 l'assignation s'effectue comme pour a3 sur une liste décrite littéralement et comme pour a2 (sous la forme d'une liste en compréhension) dans une boucle for. La liste [0,1] est réévaluée à chaque itération et on obtient donc une id différente pour chaque occurrence de la liste [0,1] contenue dans b1.
Je me demandais si ces différences de référencement sont liées au fait que les listes sont mutables?
Non en fait je m'interrogeais sur les résultats d'id entre tt et [0,1] pour a1, a2, a3 & b1, expression contre forme littérale. Mais a mieux y regarder, le référencement est lié à la gestion de distribution d'id que les objets soient ou non mutables.
Merci à tous pour cette bonne leçon qui m'a bien fait cogiter.
entwanne a écrit:
Les références multiples ne posent jamais de problèmes sur les objets immutables, puisque ces problèmes sont toujours liés aux modifications.
Je crois que je ne suis pas près de l'oublier.
Différence d'assignation de liste
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Découverte Python Doc Tkinter Les chaînes de caractères
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
Découverte Python Doc Tkinter Les chaînes de caractères