Вопрос-Ответ

Why does append() always return None in Python? [duplicate]

Почему append() всегда возвращает None в Python?
list = [1, 2, 3]
print(list.append(4)) ## WRONG, print does not work, append() returns None

## RIGHT:
list.append(4)
print(list) ## [1, 2, 3, 4]

Я изучаю Python и не уверен, специфична ли эта проблема для данного языка и как append реализована в Python.

Переведено автоматически
Ответ 1

append это мутирующая (деструктивная) операция (она изменяет список на месте, а не возвращает новый список). Идиоматический способ выполнить неразрушающий эквивалент append был бы

>>> l = [1,2,3]
>>> l + [4]
[1,2,3,4]
>>> l
[1,2,3]

отвечая на ваш вопрос, я предполагаю, что если append вернет недавно измененный список, пользователи могут подумать, что он был неразрушающим, т. Е. Они могли бы написать код типа

m = l.append("a")
n = l.append("b")

и ожидайте, что n будет [1,2,3,"b"]

Ответ 2

В 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 3.3, это теперь более явно задокументировано:


Некоторые классы коллекций изменяемы. Методы, которые добавляют, вычитают или переставляют свои элементы на место и не возвращают определенный элемент, никогда не возвращают сам экземпляр коллекции, но None.


Часто задаваемые вопросы по дизайну и истории дает обоснование этого дизайнерского решения (в отношении списков):


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


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


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


Ответ 3

list.append() это операция на месте, означающая, что она изменяет состояние list вместо возврата нового list объекта.

Все функции в Python возвращают, None если они явно не возвращают что-то другое. Метод a.append() изменяет a себя, что означает, что возвращать нечего.

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

Если вы не хотите добавлять "x" в a, то вам нужно будет использовать второй фрагмент, или вы можете просто объединить:

>>> a = [1, 2, 3, 4]
>>> b = a[1:] + ["x"]
>>> b
[2, 3, 4, 'x']

Для дальнейшего уточнения:

>>> a = [1, 2, 3, 4]
>>> b = a[1:].append("x")
>>> a
[1, 2, 3, 4]
>>> a[1:]
[2, 3, 4]
>>> type(b)
<class 'NoneType'>

Обратите внимание, что b это None, поскольку list.append() метод возвращает None. Обратите внимание также, что a на самом деле не был изменен. Это потому, что вы добавляли к фрагменту a, но на самом деле нигде не сохраняли этот фрагмент. Обратите внимание, что произойдет, если вы это сделаете a.append("x"):

>>> b = a.append("x")
>>> a
[1, 2, 3, 4, 'x']
>>> type(b)
<class 'NoneType'>

b по-прежнему работает None, но теперь a был изменен.

Ответ 4

Одним из советов было бы избегать использования ключевых слов или функций в качестве имен переменных. В приведенном выше коде вы используете list в качестве переменной:

list = [1, 2, 3]

Я бы не советовал использовать list в качестве имени переменной, поскольку list фактически уже определен как встроенный тип. Как указали ChaseTheSun и squiguy , в этом нет ничего особенного

lst = [1, 2, 3]
lst.append(4)
print(lst) ## [1, 2, 3, 4]
python list