Python en passant de la liste en argument
Si je devais exécuter ce code:
def function(y):
y.append('yes')
return y
example = list()
function(example)
print(example)
Pourquoi en serait-il de retour ["oui"], même si je ne suis pas directement modifier la variable 'exemple', et comment pourrais-je modifier le code afin que "exemple" n'est pas effectuée par la fonction?
- effbot.org/zone/default-values.htm décrit un autre, mais un peu question connexe. La lecture qui pourrait vous aider à comprendre ce qui se passe.
InformationsquelleAutor Slinc | 2010-02-23
Vous devez vous connecter pour publier un commentaire.
Tout est une référence en Python. Si vous souhaitez éviter ce comportement, vous devez créer une nouvelle copie de l'original avec
list()
. Si la liste contient plus de références, vous auriez besoin d'utiliser propriétédeepcopy()sorties
myList[:]
, mais gardez à l'esprit que c'est une "copie" ce qui signifie que le n-ième élément de la liste se réfère au même objet que le n-ième élément de la vieille".La façon la plus simple de modifier le code sera ajouter le [:] à l'appel de la fonction.
"Pourquoi en serait-il de retour
['yes']
"Parce que vous avez modifié la liste,
example
."même si je ne suis pas directement modifier la variable 'exemple'."
Mais vous, vous avez fourni à l'objet désigné par la variable
example
à la fonction. La fonction de modification de l'objet à l'aide de l'objetappend
méthode.Comme discuté ailleurs sur DONC,
append
ne crée rien de nouveau. Il modifie un objet en place.Voir Pourquoi ne liste.ajouter à false?, Python append() vs opérateur + sur les listes, pourquoi ceux-ci donnent des résultats différents?, Python, les listes d'ajouter de la valeur de retour.
et comment pourrais-je modifier le code afin que "exemple" n'est pas effectuée par la fonction?
Qu'entendez-vous par là? Si vous ne voulez pas
example
être mis à jour par la fonction, ne pas le passer à la fonction.Si vous souhaitez que la fonction pour créer une nouvelle liste, puis écrire la fonction pour créer une nouvelle liste.
Son parce que vous avez appelé la fonction d'impression avant l'impression de la liste. Si vous imprimez la liste, puis appeler la fonction, puis l'imprimer à nouveau la liste, vous obtenez une liste vide suivie par la annexé version. Sa dans l'ordre de votre code.