web-dev-qa-db-fra.com

Ajouter un numéro à définir

Qu'est-ce que je fais mal ici?

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

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

43
Randomblue

C'est une convention dans Python que les méthodes qui mutent les séquences retournent 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])

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

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

Dans les situations où les performances sont importantes, il serait inutile de faire une copie de la liste pour la trier. Par conséquent, list.sort() trie la liste en place. Afin de vous rappeler ce fait, il ne renvoie pas la liste triée. De cette façon, vous ne serez pas dupe d’écraser accidentellement une liste lorsque vous avez besoin d’une copie triée mais que vous devez également conserver 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 fourni, la trie et la retourne.

Vos problèmes particuliers avec cette fonctionnalité proviennent d'une mauvaise compréhension des bonnes façons de créer un ensemble plutôt que d'une mauvaise conception de la langue. Comme Lattyware souligne , dans Python versions 2.7 et ultérieures, vous pouvez utiliser un ensemble littéral a = {1} Ou faire a = set([1]) selon Sven Marnach réponse .

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

62
Steven Rumbalski

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

a = set()
a.add(1)

ou mieux

a = set([1])

travaillerait.

26
Sven Marnach

Parce que add() modifie votre set en place en retournant None:

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

Une autre façon de le faire qui est relativement simple serait:

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}

3
user4289108

Vous affectez la valeur renvoyée par set().add(1) à a. Cette valeur est None, car add() ne renvoie aucune valeur, elle agit à la place sur la liste.

Ce que vous vouliez faire était le suivant:

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

Bien sûr, cet exemple est trivial, mais Python prend en charge les littéraux d'ensemble, donc si vous voulez vraiment le faire, il vaut mieux le faire:

a = {1}
print(a)

Les accolades indiquent un ensemble (bien que vous soyez averti, {} dénote un dict vide, pas un ensemble vide car les accolades sont utilisées pour les dict et les sets (les dicts sont séparés par l'utilisation des deux points pour séparer les clés et les valeurs.)

2
Gareth Latty

Alternativement à a = set () | {1} considérez l'opérateur "sur place":

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

Vous devriez faire ceci:

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

Notez que vous attribuez à a le résultat de ajout1, et l'opération add, telle que définie en Python, renvoie None - et c'est ce qui est affecté à a dans votre code.

Vous pouvez également effectuer cette opération pour initialiser un ensemble:

a = set([1, 2, 3])
2
Óscar López

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

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