2012-03-14 3 views
1

Possible en double:
In Python, what is the difference between “.append()” and “+= []”?liste Python annexant

En Python, je l'ai remarqué récemment que vous pouvez ajouter des éléments de liste de deux façons:

a.append(1) 
a += [1] 

I J'aime utiliser la deuxième approche parce qu'elle est plus lisible pour moi. Y a-t-il des inconvénients à l'utiliser?

+0

Je dirais que la seconde est plus sujette aux erreurs. Est-ce que vous ajoutez le numéro '1' ou la liste' [1] '? '.append()' et '.extend()' rendent cette distension claire, tout en ne nécessitant pas les parenthèses externes confuses. –

+0

AFAICT, la notation de parenthèse est identique à 'a.extend ([1])', qui agit exactement comme 'a.append (1)'. Le seul inconvénient est que la deuxième approche est à peu près deux fois plus lente. – Blender

+0

Mais '.append()' et '.extend()' sont encore plus faciles à confondre. Personnellement je trouve '+ = [1]' absolument clair. C'est ce que vous avez l'habitude de faire, je suppose ... – alexis

Répondre

5

Ces deux méthodes ne sont pas tout à fait équivalentes. La méthode +=:

a += [1] 

exige que vous créez une nouvelle liste contenant l'élément unique 1, le cloue à la liste a, puis jetez la liste à un seul élément. Ce serait plus équivalent à:

a.extend([1]) 

Vous constaterez probablement que a.append(1) moins d'efforts à, car il n'a pas besoin de créer une liste unique élément qu'il va juste jeter à l'étape suivante.

2

Découvrez les résultats intéressants here. Version courte: append est plus rapide.

+1

Je ne savais pas quoi chercher, merci. Pouvez-vous signaler ma question en tant que doublon? – Blender

0

Cela dépend de l'implémentation Python, mais append ne sera jamais plus lent que la deuxième variante.

a += [1] crée une liste temporaire avec un élément. De plus, l'opérateur += doit effectuer un travail supplémentaire pour déterminer la taille de la nouvelle liste. Une bonne implémentation Python peut réduire la surcharge en ne construisant pas réellement la liste [1] en mémoire.

Comme avec pratiquement toutes les questions de performance, cela n'a pas d'importance à moins que votre code ne soit vraiment critique. Avec cpython 2.7, j'ai mesuré les valeurs suivantes:

>>> import timeit 
>>> timeit.timeit('l = []\nfor i in range(200):\n\tl.append(1)\n') 
27.95561385154724 
>>> timeit.timeit('l = []\nfor i in range(200):\n\tl += [1]\n') 
37.52841401100159 
Questions connexes