перевод статьи 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
, то обычно он вернет новый объект, оставляя первоначальный без изменения.