86 votes

Pourquoi append() renvoie-t-il toujours None en Python ?

list = [1, 2, 3]
print(list.append(4))   ## WRONG, print does not work, append() returns None

## RIGHT:
list.append(4)
print(list)  ## [1, 2, 3, 4]

Je suis en train d'apprendre Python et je ne sais pas si ce problème est spécifique au langage et comment le résoudre. append est implémenté en Python.

96voto

xuanji Points 897

append est une opération de mutation (destructive) (elle modifie la liste en place au lieu de renvoyer une nouvelle liste). La façon idiomatique de faire l'équivalent non destructif de append serait

>>> l = [1,2,3]
>>> l + [4]
[1,2,3,4]
>>> l
[1,2,3]

Pour répondre à votre question, je pense que si les append a renvoyé la liste nouvellement modifiée, les utilisateurs pourraient penser qu'elle n'est pas destructive, c'est-à-dire qu'ils pourraient écrire un code comme

m = l.append("a")
n = l.append("b")

et s'attendre à ce que n être [1,2,3,"b"]

25voto

Steven Rumbalski Points 16838

En Python, les méthodes qui modifient des séquences renvoient, par convention, les informations suivantes None .

Envisager :

>>> a_list = [3, 2, 1]
>>> print a_list.sort()
None
>>> a_list
[1, 2, 3]

>>> a_dict = {}
>>> print a_dict.__setitem__('a', 1)
None
>>> a_dict
{'a': 1}

>>> a_set = set()
>>> print a_set.add(1)
None
>>> a_set
set([1])

À partir de Python 3.3, c'est maintenant plus explicitement documenté :

Certaines classes de collection sont mutables. Les méthodes qui ajoutent, soustraient, ou réarrangent leurs membres en place et ne renvoient pas d'élément spécifique, ne renvoient jamais l'instance de la collection elle-même, mais None .

FAQ sur la conception et l'histoire donne le raisonnement à l'origine de cette décision de conception (en ce qui concerne les listes) :

Pourquoi les list.sort( ) renvoie la liste triée ?

Dans les situations où la performance est importante, le maki juste pour la trier serait un gaspillage. C'est pourquoi, list.sort() s à la place de la liste. Afin de vous rappeler ce fait, il ne renvoie pas la liste triée. Ainsi, vous ne risquez pas d'écraser accidentellement une liste accidentellement une liste lorsque vous avez besoin d'une copie triée mais aussi de conserver la version non triée.

Dans Python 2.4, une nouvelle fonction intégrée - sorted() - Cette fonction crée une nouvelle liste à partir d'un itérable fourni, la trie et la renvoie.

4voto

jbiz Points 83

Un conseil : évitez d'utiliser des mots clés ou des fonctions comme noms de variables. Dans votre code ci-dessus, vous utilisez list comme variable :

list = [1, 2, 3]

Je vous déconseille d'utiliser list comme nom de variable en tant que liste est en fait déjà défini comme un type intégré. Comme l'ont souligné ChaseTheSun et squiguy, il n'y a pas grand chose d'autre à dire que

lst = [1, 2, 3]
lst.append(4)
print(lst)  ## [1, 2, 3, 4]

3voto

blorgon Points 15

list.append() est une opération in-place, ce qui signifie qu'elle modifie l'état de l'élément list au lieu de renvoyer un nouveau list objet.

Toutes les fonctions de Python renvoient None à moins qu'ils ne renvoient explicitement autre chose. La méthode a.append() modifie a lui-même, ce qui signifie qu'il n'y a rien à renvoyer.

Une autre façon de voir ce comportement est de constater la différence entre sorted(some_list) y some_list.sort() .

Si vous ne voulez pas ajouter "x" à a vous devrez alors utiliser le deuxième extrait, ou vous pouvez simplement concaténer :

>>> a = [1, 2, 3, 4]
>>> b = a[1:] + ["x"]
>>> b
[2, 3, 4, 'x']

Pour plus de clarté :

>>> a = [1, 2, 3, 4]
>>> b = a[1:].append("x")
>>> a
[1, 2, 3, 4]
>>> a[1:]
[2, 3, 4]
>>> type(b)
<class 'NoneType'>

Notez que b es None , puisque le list.append() la méthode renvoie None . Notez également que a n'a pas été modifié. C'est parce que vous avez ajouté à une tranche de a mais sans sauvegarder cette tranche où que ce soit. Remarquez ce qui se passe si vous faites a.append("x") :

>>> b = a.append("x")
>>> a
[1, 2, 3, 4, 'x']
>>> type(b)
<class 'NoneType'>

b est toujours None mais maintenant a a été modifié.

-1voto

Rajendra s Points 1

Elle ne renvoie rien. Elle ajoute à la variable, pour voir, il faut utiliser la première variable qui a été ajoutée à l'impression.

friends=["Rajendra V"]
friends.append("John")
print(friends)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X