web-dev-qa-db-fra.com

Pourquoi append n'en renvoie-t-il aucun dans ce code?

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

J'apprends Python et je ne sais pas si ce problème est spécifique au langage et comment append est implémenté dans Python.

34
Nima Vaziri

append est une opération en mutation (destructive) (elle modifie la liste en place au lieu de renvoyer une nouvelle liste). La manière idiomatique de faire l’équivalent non destructif de append serait:

l = [1,2,3]
print l + [4] # [1,2,3,4]
print l # [1,2,3]

pour répondre à votre question, je suppose que si append renvoyait la liste nouvellement modifiée, les utilisateurs pourraient penser qu’elle était non destructive, c’est-à-dire qu’ils pourraient écrire du code comme

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

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

43
xuanji

Selon une convention en Python, les méthodes qui mutent des séquences renvoient None.

Considérer:

>>> 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])

Depuis Python 3.3, c'est maintenant plus explicitement documenté :

Certaines classes de collection sont modifiables. Les méthodes qui ajoutent, soustraient, ou réorganiser leurs membres sur place, et ne pas retourner un élément spécifique, ne retournez jamais l'instance de collection elle-même mais None.

La conception et l'historique FAQ donne le raisonnement derrière cette décision de conception (par rapport aux listes):

Pourquoi list.sort() ne renvoie-t-il pas la liste triée?

Dans les situations où la performance compte, faire une copie de la liste juste pour trier ce serait un gaspillage. Par conséquent, list.sort() trie le fichier liste en place. Pour vous rappeler ce fait, il ne revient pas la liste triée. De cette façon, vous ne serez pas dupe accidentellement écraser une liste lorsque vous avez besoin d’une copie triée mais que vous devez également conserver la version non triée autour.

En Python 2.4, une nouvelle fonction intégrée - sorted() - a été ajoutée . Cette fonction crée une nouvelle liste à partir d'un itératif fourni, la trie et le retourne.

12
Steven Rumbalski

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

list = [1, 2, 3]

Je vous déconseille d'utiliser list comme nom de variable en tant que list est en fait déjà défini en tant que type intégré. Comme ChaseTheSun et squiguy ont fait remarquer, il n'y a pas beaucoup plus à faire que

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

Ça ne retourne rien. il ajoute/ajoute à la variable, pour voir, vous devriez utiliser la première variable

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