Maison >développement back-end >Tutoriel Python >Pourquoi l'attribution d'une nouvelle liste à un argument de fonction ne modifie-t-elle pas la liste d'origine en Python ?

Pourquoi l'attribution d'une nouvelle liste à un argument de fonction ne modifie-t-elle pas la liste d'origine en Python ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-01 11:42:021091parcourir

Why Does Assigning a New List to a Function Argument Not Modify the Original List in Python?

Modifier une liste dans le cadre d'une fonction

En Python, lorsqu'une fonction reçoit une liste comme argument, le paramètre devient effectivement une référence pointant vers l'emplacement de la liste d'origine en mémoire. Toute modification apportée à la liste au sein de la fonction est directement reflétée dans la liste d'appels.

Cependant, le code suivant démontre un comportement particulier qui remet en question cette compréhension :

<code class="python">def function1(list_arg):
   a = function2()  # function2 returns an array of numbers
   list_arg = list(a)

list1 = [0] * 5
function1(list1)
print(list1)
# [0, 0, 0, 0, 0]</code>

Dans cet exemple, nous avons l'intention que la fonction1 modifie list1 en remplaçant ses éléments par ceux du tableau a. Mais le résultat montre que list1 reste inchangé. Pourquoi cela se produit-il ?

Dévoilement du piège de la réaffectation

Le problème vient de l'hypothèse incorrecte selon laquelle l'attribution d'une nouvelle valeur à la variable list_arg dans function1 modifie la liste d'origine. En réalité, cette affectation modifie uniquement la référence de list_arg pour pointer vers un objet différent en mémoire. La liste originale référencée par le code appelant reste intacte.

Réalisation de la modification souhaitée

Pour réussir à modifier la liste originale dans la fonction1, nous devons modifier ses éléments individuels. Cela peut être accompli via l'affectation de tranche :

<code class="python">list_arg[:] = list(a)</code>

L'affectation de tranche remplace toute la plage d'éléments dans list_arg par les valeurs de list(a). En effet, cette action modifie directement la liste d'origine.

Une mise en garde

Bien que l'affectation de tranches fournisse une solution pratique, il est important de noter son potentiel de confusion. En modifiant une liste en place, le code devient moins transparent et plus susceptible aux malentendus de la part des autres développeurs qui le maintiennent. Envisagez des approches alternatives, telles que le renvoi d'une nouvelle liste modifiée à partir de la fonction, pour améliorer la clarté et la lisibilité du code.

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