Czy lista Python ma zagwarantowane, że jej elementy pozostaną w kolejności, w której są wstawiane?

318

Jeśli mam następujący kod Python

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

Czy xzawsze będzie zagwarantowane [1,2,3], czy też możliwe są inne zamówienia elementów pośrednich?

samoz
źródło

Odpowiedzi:

479

Tak, kolejność elementów na liście python jest trwała.

sge
źródło
17
To właściwa odpowiedź, więc nie chcę dodawać kolejnej. Mógłby także użyć list. Append, aby naprawdę uspokoić umysł. docs.python.org/2/tutorial/datastructures.html
NG.
1
co jeśli zwrócę listę lokalną z funkcji i użyję jej w funkcji wywołującej. To jest def fn_1(): lst = [] lst.append(1) lst.append(2) return lsti def fn_2(): print(fn_1())czy kolejność będzie ZAWSZE bez względu na to, ile razy lub gdziekolwiek użyję fn_1 ()?
TheCuriousOne
6
Tak, kolejność elementów na liście python jest trwała. ;)
SG
82

Krótko mówiąc, tak, kolejność jest zachowana. W długim:

Zasadniczo następujące definicje zawsze będą miały zastosowanie do obiektów takich jak listy:

Lista to zbiór elementów, które mogą zawierać zduplikowanych elementów i ma określony porządek, że na ogół nie zmieni, chyba że wyraźnie się, aby to zrobić. stosy i kolejki to oba typy list, które zapewniają określone (często ograniczone) zachowanie podczas dodawania i usuwania elementów (stosy to LIFO, kolejki to FIFO). Listy są praktycznymi reprezentacjami, no cóż, list rzeczy. Ciąg może być traktowany jako lista znaków, ponieważ kolejność jest ważna ( "abc" != "bca"), a duplikaty w treści ciągu są z pewnością dozwolone ( "aaa"mogą istnieć i != "a").

Zestaw to zbiór elementów, które nie mogą zawierać duplikaty i ma zakaz określony porządek, które mogą lub nie mogą zmieniać się w czasie. Zestawy nie reprezentują list rzeczy, tyle że opisują zakres pewnego wyboru rzeczy. Wewnętrzna struktura zestawu, w jaki sposób jego elementy są przechowywane względem siebie, zwykle nie ma na celu przekazywania użytecznych informacji. W niektórych implementacjach zestawy są zawsze sortowane wewnętrznie; w innych kolejność jest po prostu niezdefiniowana (zwykle w zależności od funkcji skrótu).

Kolekcja to ogólny termin odnoszący się do dowolnego obiektu używanego do przechowywania (zwykle zmiennej) liczby innych obiektów. Zarówno listy, jak i zestawy są rodzajem kolekcji. Krotki i tablice zwykle nie są uważane za kolekcje. Niektóre języki uznają również mapy (kontenery opisujące powiązania między różnymi obiektami) za rodzaj kolekcji.

Ten schemat nazewnictwa sprawdza się we wszystkich znanych mi językach programowania, w tym w Pythonie, C ++, Javie, C # i Lisp (w których listy nieprzestrzegające ich kolejności byłyby szczególnie katastrofalne). Jeśli ktoś wie o czymkolwiek, co nie jest prawdą, proszę to powiedzieć, a ja zredaguję moją odpowiedź. Zauważ, że określone implementacje mogą używać innych nazw dla tych obiektów, takich jak wektor w C ++ i flex w ALGOL 68 (obie listy; flex jest technicznie tylko zmienną tablicą).

Jeśli w twoim przypadku pozostało jakieś zamieszanie związane ze specyfiką działania +znaku, wiedz, że kolejność jest ważna dla list i chyba że istnieje bardzo dobry powód, by wierzyć inaczej, możesz prawie zawsze bezpiecznie założyć, że operacje na listach zachowują porządek . W tym przypadku +znak zachowuje się bardzo podobnie do łańcuchów (które tak naprawdę są tylko listami znaków): pobiera zawartość listy i umieszcza ją za treścią innego.

Jeśli mamy

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

Następnie

list1 + list2

Jest taki sam jak

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

Który ocenia na

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

Podobnie jak

"abdcde" + "fghijk"

Produkuje

"abdcdefghijk"
Zbliża się do ciemności
źródło
1
Czytałem gdzieś, że ponieważ specyfikacja tablicy JSON nie określa, że ​​tablice zachowują porządek, operacje na tablicach zamówień nie są gwarantowane w celu utrzymania porządku. Nie mogę jednak znaleźć źródła tego. A podstawowa struktura macierzy to wciąż szczególny przypadek obiektu z numerowanymi indeksami, więc nie jest to sprzeczność z twoim stwierdzeniem, tylko ciekawa ciekawostka, pomyślałem.
Multihunter,
1
Nie zgadzam się z wyjaśnieniem zestawu. Zestawy zdecydowanie nie są „nastawione bardziej na cele matematyczne i teoretyczne niż na rzeczywiste”. Zamiast tego zestawy są bardzo przydatne za każdym razem, gdy potrzebny jest zbiór zawierający elementy, których nie można powtórzyć, i oferują takie narzędzia, jak różnica i przecięcie, które są przydatne w modelowaniu rzeczywistych przypadków użycia.
Pintun,
1
@Pintun patrząc wstecz kilka lat po napisaniu tego postu Zgadzam się z tobą. Będę edytować, gdy wymyślę lepszy sposób wyrażenia tego, do czego dążyłem.
ApproachingDarknessFish,
5

Mylisz „zestawy” i „listy”. Zestaw nie gwarantuje kolejności, ale listy tak.

Zestawy są deklarowane przy użyciu nawiasów klamrowych: {}. W przeciwieństwie do tego, listy są uznane za pomocą nawiasów kwadratowych: [].

mySet = {a, b, c, c}

Nie gwarantuje zamówienia, ale lista:

myList = [a, b, c]
Jonathan Muckell
źródło
1
Pamiętaj, że zestaw gwarantuje również brak powielania. Lista może zawierać zduplikowane elementy, a zestaw nie.
Nathaniel Ford
4

Przypuszczam, że jedną z rzeczy, które mogą cię dotyczyć, jest to, czy wpisy mogą się zmienić, tak że na przykład 2 stanie się inną liczbą. Tutaj możesz się uspokoić, ponieważ w Pythonie liczby całkowite są niezmienne , co oznacza, że ​​nie mogą się zmienić po ich utworzeniu.

Jednak nie wszystko w Pythonie jest niezmienne. Na przykład listy można modyfikować --- można je zmieniać po utworzeniu. Na przykład, jeśli masz listę list

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

Tutaj zmieniłem pierwszy wpis a(dodałem 7do niego). Można sobie wyobrazić tasowanie rzeczy i uzyskiwanie nieoczekiwanych rzeczy, jeśli nie jesteś ostrożny (i rzeczywiście dzieje się tak ze wszystkimi, gdy zaczynają programować w Pythonie w taki czy inny sposób; po prostu wyszukaj na tej stronie „modyfikowanie listy podczas przeglądania w pętli” to „, aby zobaczyć dziesiątki przykładów).

Warto również na to zwrócić uwagę x = x + [a]i x.append(a)to nie to samo. Drugi mutuje x, a pierwszy tworzy nową listę i przypisuje ją x. Aby zobaczyć różnicę, spróbuj ustawić y = xprzed dodaniem czegokolwiek xi wypróbowaniem każdego z nich, i spójrz na różnicę między nimi y.

asmeurer
źródło
0

aList = [1,2,3]

i = 0

for item in aList:  

    if i<2:  

            aList.remove(item)  

    i+=1  

aList

[2]

Morał polega na tym, że modyfikując listę w pętli sterowanej przez listę, wykonuje dwa kroki:

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]
chłopiec ralphie
źródło
0

Tak, listy i krotki są zawsze uporządkowane, a słowniki nie

Ysh
źródło
1
Z wyjątkiem Pythona 3: D
mbeacom