Maison > Article > développement back-end > Pourquoi la modification d'une liste imbriquée en Python entraîne-t-elle des résultats inattendus ?
Les indices de listes imbriquées revisités
En Python, les listes imbriquées offrent un moyen pratique d'organiser les données. Cependant, travailler avec des index pour ces listes peut parfois conduire à des résultats inattendus. Explorons un problème courant lié aux index de liste imbriquée avec un exemple de code spécifique :
Considérez l'extrait de code suivant :
<code class="python">some_list = 4 * [(4 * [0])] for i in range(3): for j in range(3): some_list[i+1][j+1] = 1 for i in range(4): print(some_list[i])</code>
L'objectif visé est de créer une liste 2D où les valeurs à chaque index (à l'exclusion de la première ligne et de la première colonne) est défini sur 1. Cependant, le code ne parvient pas à y parvenir. Au lieu de cela, il produit une liste dans laquelle toutes les lignes et colonnes sont remplies de 1.
Explication :
La cause première de ce problème réside dans la méthode Python de transmission des listes par référence. Contrairement aux types de valeurs de base, les listes sont transmises sous forme de références au même emplacement mémoire. Cela signifie que toute modification apportée à une variable de liste sera reflétée dans toutes les autres variables faisant référence à la même liste.
Dans le code donné, la ligne some_list = 4 * [(4 * [0])] multiplie a liste contenant une seule valeur 0 quatre fois. Toutefois, cela ne crée pas quatre listes distinctes. Au lieu de cela, il crée une seule liste avec quatre références pointant vers la même valeur 0.
En conséquence, lorsque le code met à jour la valeur à [i 1][j 1] pour la première itération de la boucle, il modifie la valeur vers laquelle pointent toutes les autres références. Cela explique pourquoi tous les éléments finissent avec la valeur 1.
Solution :
Pour résoudre ce problème et créer quatre listes distinctes, chacune avec son propre ensemble de valeurs, il faut éviter la deuxième multiplication. Une façon de procéder consiste à utiliser une boucle pour initialiser chaque ligne de la liste séparément :
<code class="python">some_list = [(4 * [0]) for _ in range(4)]</code>
En bouclant sur range(4), ce code crée quatre listes distinctes, chacune avec un ensemble de valeurs distinct. . Par conséquent, les modifications ultérieures apportées aux valeurs de la liste n'affecteront pas les autres lignes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!