Проблема с добавлением при использовании понимания списка (python 3.6.5) [duplicate]

Я думаю, что соответствующие части стандарта C99 составляют 6.5. Выражения, §2

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

и 6.5.16 Операторы присваивания, §4:

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

29
задан Nima Vaziri 20 May 2013 в 01:52
поделиться

3 ответа

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

l = [1,2,3]
print l + [4] # [1,2,3,4]
print l # [1,2,3]

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

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

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

37
ответ дан smci 3 September 2018 в 15:20
поделиться

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

list = [1, 2, 3]

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

l = [1, 2, 3]
l.append(4)
print l  ## [1, 2, 3, 4]
3
ответ дан mgilson 3 September 2018 в 15:20
поделиться

Это соглашение в 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() - был добавлен. Эта функция создает новый список из предоставленного итерации, сортирует его и возвращает его.

9
ответ дан Steven Rumbalski 3 September 2018 в 15:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: