Является ли список Python гарантированным, чтобы его элементы оставались в том порядке, в котором они были вставлены?

Если у меня есть следующий код Python

>>> x = [] >>> x = x + [1] >>> x = x + [2] >>> x = x + [3] >>> x [1, 2, 3] 

Будет ли гарантировано, что х всегда будет [1,2,3] , или возможны другие упорядочения временных элементов?

Да, порядок элементов в списке python является постоянным.

Короче говоря, да, порядок сохраняется. В долгосрочной перспективе:

В общем случае следующие определения всегда будут применяться к таким объектам, как списки:

Список представляет собой набор элементов, который может содержать повторяющиеся элементы и имеет определенный порядок, который обычно не изменяется, если явно не сделать этого. стеки и очереди представляют собой оба типа списков, которые обеспечивают конкретное (часто ограниченное) поведение для добавления и удаления элементов (стеки являются LIFO, очереди – FIFO). Списки – это практические представления, ну, списки вещей. Строку можно рассматривать как список символов, так как порядок важен ( "abc" != "bca" ), и дубликаты в содержимом строки, безусловно, разрешены ( "aaa" может существовать и != "a" A != "a" ).

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

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

Эта схема именования справедлива для всех языков программирования, о которых я знаю, включая Python, C ++, Java, C # и Lisp (в которых списки, не сохраняющие их порядок, будут особенно катастрофическими). Если кто-нибудь знает о том, где это не так, просто скажите об этом, и я отредактирую свой ответ. Обратите внимание, что для конкретных реализаций могут использоваться другие имена для этих объектов, такие как вектор в C ++ и flex в ALGOL 68 (оба списка: flex – это технически просто перемасштабируемый массив).

Если в вашем случае есть какая-то путаница из-за специфики того, как здесь работает знак + , просто знайте, что порядок важен для списков, и если нет веских оснований полагать, что в противном случае вы почти всегда можете с уверенностью предположить, что операции списка сохраняются заказ. В этом случае знак + ведет себя так же, как и для строк (которые в действительности являются просто списками символов): он принимает содержимое списка и помещает его за содержимое другого.

Если мы имеем

 list1 = [0, 1, 2, 3, 4] list2 = [5, 6, 7, 8, 9] 

затем

 list1 + list2 

Такой же как

 [0, 1, 2, 3, 4] + [5, 6, 7, 8, 9] 

Что оценивается

 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

Так же, как

 "abdcde" + "fghijk" 

Производит

 "abdcdefghijk" 

Я полагаю, что одна вещь, которая может касаться вас, заключается в том, могут ли записи измениться, так что, например, 2 становится другим числом. Здесь вы можете успокоить ум, потому что в Python целые числа неизменны , то есть они не могут измениться после их создания.

Однако не все в Python является неизменным. Например, списки изменяемы – они могут измениться после создания. Например, если у вас есть список списков

 >>> a = [[1], [2], [3]] >>> a[0].append(7) >>> a [[1, 7], [2], [3]] 

Здесь я изменил первую запись (я добавил 7 к ней). Можно подумать о том, чтобы перетасовать вещи и получить здесь неожиданные вещи, если вы не будете осторожны (и действительно, это происходит со всеми, когда они начинают программировать на Python так или иначе, просто выполните поиск на этом сайте для «изменения списка при прохождении через это «увидеть десятки примеров».

Также стоит отметить, что x = x + [a] и x.append(a) – это не одно и то же. Второй мутирует x , а первый создает новый список и присваивает его x . Чтобы увидеть разницу, попробуйте установить y = x прежде чем добавлять что-либо к x и пробовать каждый, и посмотреть на разницу, которую они делают с y .

Вы путаете «наборы» и «списки». Набор не гарантирует порядок, но списки делают.

Наборы объявляются с помощью фигурных скобок: {} . Напротив, списки объявляются с помощью квадратных скобок: [] .

 mySet = {a, b, c, c} 

Не гарантирует порядок, но список:

 myList = [a, b, c] 

ALIST = [1,2,3]

= 0

 for item in aList: if i<2: aList.remove(item) i+=1 

список

[2]

Мораль заключается в изменении списка в цикле, управляемом списком, выполняется два шага:

 aList=[1,2,3] i=0 for item in aList: if i<2: aList[i]="del" i+=1 aList ['del', 'del', 3] for i in range(2): del aList[0] aList [3] 

Да, списки и кортежи всегда заказываются, а словари – нет.