Подтвердить что ты не робот

Добавить число для установки

Что я здесь делаю неправильно?

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

Я пытаюсь добавить число 1 в пустой набор.

4b9b3361

Ответ 1

Это соглашение в Python, что методы, которые мутируют последовательности, возвращают None.

Рассмотрим:

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

Некоторые могут считать это соглашение "ужасным неправильным дизайном в Python", но "Вопросы дизайна и истории" дает аргументацию за этим проектным решением (с соблюдение списков):

Почему doesnt list.sort() возвращает отсортированный список?

В ситуациях, когда важна производительность, составление копии списка просто сортировать было бы расточительно. Поэтому list.sort() сортирует список на месте. Чтобы напомнить вам об этом, он не возвращается отсортированный список. Таким образом, вас случайно не обманут переписывание списка, когда вам нужна отсортированная копия, но также необходимо сохранить несортированная версия вокруг.

В Python 2.4 добавлена ​​новая встроенная функция - sorted() -. Эта функция создает новый список из предоставленного итерации, сортирует его и возвращает его.

Ваши особые проблемы с этой функцией возникают из-за непонимания хороших способов создания набора, а не неправильного определения языка. Как указывает Lattyware , в версиях Python 2.7 и более поздних версиях вы можете использовать набор литералов a = {1} или do a = set([1]) в соответствии с Sven Marnach ответ.

В паритетном отношении мне нравится соглашение Ruby о размещении восклицательного знака после методов, которые мутируют объекты, но я считаю приемлемым подход Python.

Ответ 2

Метод add() добавляет элемент в набор, но он снова не возвращает набор - он возвращает None.

a = set()
a.add(1)

или лучше

a = set([1])

будет работать.

Ответ 3

Поскольку add() изменяет ваш набор на место, возвращая None:

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

Ответ 4

Вы должны сделать это:

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

Обратите внимание, что вы присваиваете a результат добавления 1, а операция add, как определено в Python, возвращает None - и то, что присваивается a в вашем код.

В качестве альтернативы вы можете сделать это для инициализации набора:

a = set([1, 2, 3])

Ответ 5

Метод добавления обновляет набор, но возвращает None.

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

Ответ 6

Вы присваиваете значение, возвращаемое set().add(1), на a. Это значение None, так как add() не возвращает никакого значения, оно вместо этого действует на месте в списке.

Что вы хотели сделать, так это:

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

Конечно, этот пример тривиален, но Python поддерживает набор литералов, поэтому, если вы действительно этого хотели, лучше сделать:

a = {1}
print(a)

Кудрявые скобки обозначают множество (хотя следует предупредить, {} обозначает пустой dict, а не пустой набор из-за того, что фигурные скобки используются как для dicts, так и для наборов (dicts разделены использованием двоеточия для разделения ключей и значений.)

Ответ 7

Другой способ сделать это относительно просто:

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

это создает объединение между вашим набором a и набором с 1 в качестве элемента

print (a) дает {1}, тогда, поскольку a теперь будет иметь все элементы как a, так и {1}