Почему Python присваивает None, если вы добавляете переменную в набор при ее назначении

Вместо того, чтобы добавлять переменную в правильный набор, например:

 set_to_add_to = set()
 set_to_add_to.add("test")

Я просто случайно закодировал:

 set_to_add_to = set()
 set_to_add_to = set_to_add_to.add("test")

Хотя я понимаю, что это не то, как вы должны добавлять элементы в набор, меня больше всего удивило то, что выполнение вышеуказанного привело к тому, что set_to_add_to принял значение None. Я не мог понять, почему это произошло - это похоже на int_variable = int_variable + 5, который работает правильно.

По аналогии:

 set_to_add_to = set()
 new_set = set_to_add_to.add("test")

приводит к тому, что new_set принимает значение None - почему это не тот случай, когда сначала test добавляется к set_to_add_to, а затем присваивается new_set?


person kyrenia    schedule 25.02.2016    source источник
comment
Вызов .add(test) добавляет test в набор, но сама функция возвращает None. Вы не должны назначать new_set, вместо этого поместите назначение и вызов .add() в разные строки. то есть set_to_add_to.add(test) - это все, что вам нужно.   -  person Jacob H    schedule 25.02.2016
comment
set являются неизменяемыми структурами данных в python, а функция add() возвращает None   -  person riteshtch    schedule 25.02.2016


Ответы (2)


Прежде всего важно отметить, что все функции (включая пользовательские и встроенные функции) что-то возвращают. Обычно легко увидеть, что возвращает функция, по ее оператору return. В функции без оператора return по умолчанию возвращается None.

Теперь об обосновании того, почему некоторые часто используемые функции Python возвращают None.

Как правило, функции Python, которые изменяют объекты на месте, возвращают None.

Например:

x = [4,3,7,8,2]
y = sorted(x) #y is now a sorted list because sorted returns a copy!
y = x.sort() # y is now None because x was sorted in place

Заметным исключением является функция pop(), которая возвращает извлекаемое значение.

Проверьте этот пост для более подробного объяснения:

Операции на месте возвращают объект плохая идея?

x = [4,3,7,8,2]
val = x.pop() 

#val = 2
#x = [4,3,7,8]
person Garrett R    schedule 25.02.2016
comment
Поскольку OP является новым для Python, вы можете добавить, что все функции возвращают что-то, но что-то равно None, если return опущено - person cat; 25.02.2016

Метод .add() для наборов всегда возвращает None так же, как, например, метод списка .append() возвращает None.

person K. Menyah    schedule 25.02.2016