Maison >développement back-end >Tutoriel Python >Pourquoi la modification d'une liste imbriquée en Python entraîne-t-elle des résultats inattendus ?

Pourquoi la modification d'une liste imbriquée en Python entraîne-t-elle des résultats inattendus ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-30 04:12:02638parcourir

Why Does Modifying a Nested List in Python Lead to Unexpected Results?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn