Mutations de listes imbriquées : comprendre un comportement inattendu
En Python, les structures de données mutables telles que les listes peuvent se comporter de manière inattendue lorsqu'il s'agit d'imbrication. Prenons l'exemple où une liste de listes est créée :
xs = [[1] * 4] * 3
Cela initialise une structure de liste imbriquée où chaque sous-liste contient quatre éléments définis sur 1. Cependant, en modifiant l'une de ces valeurs les plus internes, comme indiqué ci-dessous :
xs[0][0] = 5
affecte tous les premiers éléments de chaque sous-liste, entraînant :
[[5, 1, 1, 1], [5, 1, 1, 1], [5, 1, 1, 1]]
Cause du comportement inattendu
La racine du problème réside dans la façon dont l'opérateur * fonctionne lorsqu'il est appliqué à des objets. Dans ce cas, la ligne :
[[1] * 4] * 3
crée trois références à la même sous-liste [1] 4, plutôt que de créer trois copies indépendantes. En effet, opère sur le résultat de l'évaluation de l'expression [1] * 4, qui est une seule sous-liste. Par conséquent, toute modification apportée à cette sous-liste unique est reflétée dans toutes les références.
Résoudre le problème
Pour créer des sous-listes indépendantes, il est nécessaire de forcer une évaluation de la [1] * 4 expressions pour chaque sous-liste. Ceci peut être réalisé en utilisant une compréhension de liste, comme vu ci-dessous :
[[1]*4 for _ in range(3)]
Dans ce cas, l'expression [1]*4 est évaluée à chaque fois, ce qui entraîne la création de trois sous-listes distinctes et toute modification à une sous-liste n'affectera que cette sous-liste et pas les autres.
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!