Андрей Попов Заметки, переводы, ссылки на ресурсы

Почему в Python list.append() возвращает None


перевод статьи Borislav Hadzhiev “Why does list.append() return None in Python”

Метод list.append() возвращает None, потому что он изменяет первоначальный список. В Python большинство методов, изменяющих объект, в котором они определены ,возвращают None.

a_list = ['bobby', 'hadz']

a_list.append('.')
a_list.append('com')

print(a_list) # ['bobby', 'hadz', '.', 'com']

Метод list.append() добавляет элемент в конец списка. Этот метод возвращает None, так как он изменяет (мутирует) исходный список.

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

Если вам нужно получить новый список путем добавления элемента к существующему списку, то используйте оператор сложения +.

a_list = ['bobby', 'hadz']

new_list = a_list + ['com']

print(new_list)  # ['bobby', 'hadz', 'com']

print(a_list) # ['bobby', 'hadz']

Оператор сложения +, стоящий между двух списков, объединяет их в один список.

Отметим, что при этом первоначальный список остается неизменным.

Также для получения нового списка добавлением к списку нового значения можно использовать метод list.append() вместе с булевым оператором or.

a_list = ['bobby', 'hadz']

new_list = a_list.append('com') or a_list

print(new_list)  # ['bobby', 'hadz', 'com']

print(a_list) # ['bobby', 'hadz', '.', 'com']

Выражение x or y возвращает левое значение, если он истинно, и правое значение в противном случае.

Метод list.append() добавляет элемент в конец списка и возвращает None, поэтому конструкция a_list.append('com') or a_list возвращает список a_list (уже с добавленным в него новым элементом).

Две переменные сохраняют один и тот же список (одно и то же место в памяти), поэтому изменение в одной переменной будут применяться и к другой переменной.

Еще один вариант получения нового списка с добавленным элементом – использовать оператор распаковки итерируемого объекта.

a_list = ['bobby', 'hadz']

new_list = [*a_list, 'com']

print(new_list)  # ['bobby', 'hadz', 'com']

print(a_list) # ['bobby', 'hadz', '.', 'com']

Оператор * позволяет “распаковать” итерируемый объект в последовательность элементов в вызовах функций, списковых включениях (list comprehensions) и выражениях-генераторах.

example = (*('a', 'b'), 'c')

print(example) # ('a', 'b', 'c')

Можно сказать, что мы распаковываем элементы списка и передаем их в качестве значений, разделенных запятыми, для создания нового списка.

После распаковки существующего списка можно добавить в него одно или несколько значений, записывая их через запятую.

Не пытайтесь присвоить результат вызова append(), insert() или extend() какой-либо переменной, так как методы, изменяющие первоначальный объект, как правило возвращают None.

Для того, чтобы увидеть тип значения, которое возвращает метод, можно в IDE навести на него указатель мыши.

Если метод возвращает None, то он при выполнении изменит сам объект. Напротив, если метод возвращает значение, отличное от None, то обычно он вернет новый объект, оставляя первоначальный без изменения.


Содержание