Maison >développement back-end >Tutoriel Python >Pourquoi la multiplication de liste crée-t-elle des sous-listes partagées en Python ?

Pourquoi la multiplication de liste crée-t-elle des sous-listes partagées en Python ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-23 12:55:101082parcourir

Why Does List Multiplication Create Shared Sublists in Python?

Changements inattendus dans les listes de listes

Lors de la création d'une liste de listes à l'aide de la multiplication de listes, soyez prudent face aux changements inattendus.

Description du problème

Création d'une liste de listes avec une simple multiplication de liste, comme :

xs = [[1] * 4] * 3

peut entraîner des conséquences inattendues. La modification d'une valeur dans une sous-liste affecte toutes les sous-listes :

xs[0][0] = 5
print(xs)
# [[5, 1, 1, 1], [5, 1, 1, 1], [5, 1, 1, 1]]

Explication

L'opérateur de multiplication opère sur des objets, pas sur des expressions. Ainsi, [[1] * 4] * 3 ne voit la sous-liste évaluée [1, 1, 1, 1] que trois fois. Au lieu de créer de nouvelles sous-listes, crée des références à celle existante.

Solution

Pour éviter ce comportement et garantir des sous-listes indépendantes, utilisez une compréhension de liste :

xs = [[1] * 4 for _ in range(3)]

Cette expression réévalue [1] * 4 pour chaque itération, ce qui donne des résultats distincts sous-listes.

Compréhension plus approfondie : les entiers immuables

Il est important de noter que les entiers en Python sont immuables. Cela signifie que des opérations telles que :

1.value = 2

ne sont pas valides, car les entiers n'ont pas d'attribut de valeur modifiable. Par conséquent, même si [1] * 4 ne copie pas les entiers eux-mêmes, cela n'a pas d'importance car les entiers ne peuvent pas être modifiés.

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