как все иначе? [Дубликат]

В https://stackoverflow.com/questions/29505280/incrementing-array-index-in-c кто-то спросил об утверждении типа:

int k[] = {0,1,2,3,4,5,6,7,8,9,10};
int i = 0;
int num;
num = k[++i+k[++i]] + k[++i];
printf("%d", num);

, который печатает 7 ... OP ожидал, что он будет печатать 6.

Приращения ++i не гарантируются, чтобы все было выполнено до остальных вычислений. Фактически, разные компиляторы получат разные результаты. В примере, который вы указали, были выполнены первые 2 ++i, затем были прочитаны значения k[], затем последний ++i, затем k[].

num = k[i+1]+k[i+2] + k[i+3];
i += 3

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

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 в 16:45
поделиться

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

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 в 16:45
поделиться

Это соглашение в 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 в 16:45
поделиться
Другие вопросы по тегам:

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