43 votes

Ajouter un numéro à l'ensemble

Qu'est-ce que je fais de mal ici ?

a = set().add(1)
print a # Prints `None`

J'essaie d'ajouter le nombre 1 à l'ensemble vide.

64voto

Steven Rumbalski Points 16838

C'est une convention en Python que les méthodes qui mutent des séquences retournent None .

Pensez-y :

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

Certains peuvent considérer cette convention comme "une horrible erreur de conception en Python", mais la FAQ Conception et histoire donne le raisonnement derrière cette décision de conception (en ce qui concerne les listes) :

Pourquoi est-ce que list.sort( ) renvoie la liste triée ?

Dans les situations où la performance est importante, faire une copie de la liste juste pour la trier serait une perte de temps. Par conséquent, list.sort() trie les en place. Afin de vous rappeler ce fait, il ne retourne pas la liste triée. De cette façon, vous ne risquez pas de vous tromper et de accidentellement écraser une liste lorsque vous avez besoin d'une copie triée mais que vous la version non triée.

Dans 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érable, la trie et la renvoie. et la renvoie.

Vos problèmes particuliers avec cette fonctionnalité proviennent d'une mauvaise compréhension des bonnes manières de créer un ensemble plutôt que d'une mauvaise conception du langage. Comme Lattyware souligne Dans les versions 2.7 et ultérieures de Python, vous pouvez utiliser un littéral de type "set". a = {1} ou faire a = set([1]) selon l'avis de Sven Marnach réponse .

Entre parenthèses, j'aime la convention de Ruby qui consiste à placer un point d'exclamation après les méthodes qui mutent les objets, mais je trouve l'approche de Python acceptable.

26voto

Sven Marnach Points 133943

Le site add() ajoute un élément à l'ensemble, mais ne renvoie pas l'ensemble à nouveau -- elle renvoie la méthode None .

a = set()
a.add(1)

ou mieux

a = set([1])

fonctionnerait.

5voto

Rik Poggi Points 10195

Parce que add() est de modifier votre ensemble en place en retournant None :

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

5voto

user4289108 Points 51

Une autre façon de procéder, relativement simple, serait la suivante :

a = set()
a = set() | {1}

cela crée une union entre votre ensemble a et un ensemble avec 1 comme élément

print(a) donne {1} alors parce que a aurait maintenant tous les éléments de a et {1}

2voto

Paul McGuire Points 24790

La méthode add met à jour l'ensemble, mais renvoie None.

a = set()
a.add(1)
print a

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