Maison > développement back-end > Tutoriel Python > Pourquoi la modification d'une sous-liste dans une liste Python imbriquée affecte-t-elle toutes les sous-listes ?

Pourquoi la modification d'une sous-liste dans une liste Python imbriquée affecte-t-elle toutes les sous-listes ?

Barbara Streisand
Libérer: 2024-12-29 07:50:12
original
321 Les gens l'ont consulté

Why Does Modifying a Sublist in a Nested Python List Affect All Sublists?

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
Copier après la connexion

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
Copier après la connexion

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)]
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal