Confusion de mutabilité de liste imbriquée en Python
Introduction :
En Python, un problème courant se produit lorsqu'il s'agit de listes imbriquées. Les modifications apportées à une sous-liste affectent de manière inattendue toutes les autres sous-listes de la liste externe. Ce comportement inattendu provient du mécanisme sous-jacent de création et de mutabilité de liste.
Le problème :
Considérez le code suivant :
xs = [[1] * 4] * 3
Ceci le code crée une liste de listes, où chaque sous-liste contient quatre 1. Cependant, la modification de l'un des éléments les plus internes, comme indiqué ci-dessous, affecte toutes les sous-listes :
xs[0][0] = 5
Au lieu de changer uniquement le premier élément de la première sous-liste, tous les premiers éléments de toutes les sous-listes sont modifiés à 5.
Raison :
La clé pour comprendre ce comportement réside dans la façon dont Python multiplie les séquences. Lorsque vous utilisez l'opérateur * sur une liste existante [x], il ne crée pas de nouvelles listes. Au lieu de cela, il crée plusieurs références au même objet de liste.
Par conséquent, dans le code xs = [[1] * 4] * 3, l'expression [1] * 4 est évaluée une fois, et trois les références à cette liste unique sont affectées à la liste externe. Cela signifie que toutes les sous-listes sont le même objet.
Solution :
Pour créer des sous-listes indépendantes, vous pouvez utiliser une compréhension de liste :
xs = [[1] * 4 for _ in range(3)]
Dans ce cas, la compréhension de liste réévalue l'expression [1] * 4 pour chaque itération, ce qui donne trois résultats distincts. listes.
Immuabilité des entiers :
Il est important de noter que les entiers en Python sont immuables, ce qui signifie que leur valeur ne peut pas être modifiée. Par conséquent, même si l'opérateur * crée plusieurs références à la même liste, les valeurs des entiers de cette liste ne sont pas affectées.
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!