web-dev-qa-db-fra.com

Python passant 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 retournerait-il ['oui'] même si je ne change pas directement la variable 'exemple', et comment pourrais-je modifier le code pour que 'exemple' ne soit pas affecté par la fonction?

22
Slinc

Tout est une référence en Python. Si vous souhaitez éviter ce comportement, vous devrez créer une nouvelle copie de l'original avec list(). Si la liste contient plus de références, vous devez utiliser deepcopy ()

def modify(l):
 l.append('HI')
 return l

def preserve(l):
 t = list(l)
 t.append('HI')
 return t

example = list()
modify(example)
print(example)

example = list()
preserve(example)
print(example)

les sorties

['HI']
[]
43
Vinko Vrsalovic

Le moyen le plus simple de modifier le code sera d'ajouter le [:] à l'appel de fonction.

def function(y):
    y.append('yes')
    return y



example = list()
function(example[:])
print(example)
9
Mike Kaufman

"Pourquoi retournerait-il ['yes'] "

Parce que vous avez modifié la liste, example.

"même si je ne change pas directement la variable" exemple "."

Mais vous l'êtes, vous avez fourni l'objet nommé par la variable example à la fonction. La fonction a modifié l'objet à l'aide de la méthode append de l'objet.

Comme discuté ailleurs sur SO, append ne crée rien de nouveau. Il modifie un objet en place.

Voir Pourquoi list.append est-il évalué à faux? , Opérateur Python append () vs. + sur les listes, pourquoi cela donne-t-il des résultats différents? , Listes Python ajouter la valeur de retour .

et comment pourrais-je modifier le code afin que 'exemple' ne soit pas affecté par la fonction?

Que veux-tu dire par là? Si vous ne voulez pas que example soit mis à jour par la fonction, ne le passez pas à la fonction.

Si vous souhaitez que la fonction crée une nouvelle liste, écrivez-la pour créer une nouvelle liste.

8
S.Lott

C'est parce que vous avez appelé la fonction avant d'imprimer la liste. Si vous imprimez la liste puis appelez la fonction, puis imprimez à nouveau la liste, vous obtiendrez une liste vide suivie de la version ajoutée. C'est dans l'ordre de votre code.

0
David Agabi