Apakah daftar Python dijamin memiliki unsur-unsurnya tetap dalam urutan mereka dimasukkan?

318

Jika saya memiliki kode Python berikut

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

Apakah xdijamin akan selalu demikian [1,2,3], atau apakah urutan unsur-unsur sementara lainnya dimungkinkan?

samoz
sumber

Jawaban:

480

Ya, urutan elemen dalam daftar python persisten.

pasir
sumber
17
Ini jawaban yang tepat jadi saya tidak ingin menambahkan yang lain. Dia juga bisa menggunakan daftar. Tambah untuk benar-benar menenangkan pikirannya. docs.python.org/2/tutorial/datastructures.html
NG.
1
bagaimana jika saya mengembalikan daftar lokal dari suatu fungsi dan menggunakannya dalam fungsi panggilan. Itu def fn_1(): lst = [] lst.append(1) lst.append(2) return lstdan def fn_2(): print(fn_1())apakah urutannya akan SELALU terlepas dari berapa kali atau di mana saya menggunakan fn_1 ()?
TheCuriousOne
6
Ya, urutan elemen dalam daftar python persisten. ;)
sge
82

Singkatnya, ya, pesanannya dipertahankan. Panjang:

Secara umum definisi berikut akan selalu berlaku untuk objek seperti daftar:

Sebuah daftar adalah kumpulan dari elemen-elemen yang dapat berisi elemen duplikat dan memiliki urutan didefinisikan yang umumnya tidak berubah kecuali secara eksplisit dibuat untuk melakukannya. tumpukan dan antrian adalah kedua jenis daftar yang memberikan perilaku spesifik (sering terbatas) untuk menambah dan menghapus elemen (tumpukan adalah LIFO, antrian menjadi FIFO). Daftar adalah representasi praktis dari daftar hal-hal. Sebuah string dapat dianggap sebagai daftar karakter, karena urutannya penting ( "abc" != "bca") dan duplikat dalam konten string tersebut diizinkan ( "aaa"dapat ada dan != "a").

Sebuah set adalah kumpulan dari elemen-elemen yang tidak dapat berisi duplikat dan memiliki tatanan non-pasti yang mungkin atau mungkin tidak berubah dari waktu ke waktu. Set tidak mewakili daftar hal-hal sebanyak itu menggambarkan sejauh mana suatu pilihan hal tertentu. Struktur internal set, bagaimana elemen-elemennya disimpan relatif satu sama lain, biasanya tidak dimaksudkan untuk menyampaikan informasi yang berguna. Dalam beberapa implementasi, set selalu diurutkan secara internal; di tempat lain pemesanannya tidak ditentukan (biasanya tergantung pada fungsi hash)

Koleksi adalah istilah umum yang merujuk pada objek apa pun yang digunakan untuk menyimpan sejumlah (biasanya variabel) objek lain. Baik daftar dan set adalah jenis koleksi. Tuples dan Arrays biasanya tidak dianggap sebagai koleksi. Beberapa bahasa menganggap peta (wadah yang menggambarkan hubungan antara objek yang berbeda) sebagai jenis koleksi juga.

Skema penamaan ini berlaku untuk semua bahasa pemrograman yang saya tahu, termasuk Python, C ++, Java, C #, dan Lisp (di mana daftar yang tidak menjaga urutannya akan menjadi bencana besar). Jika ada yang tahu di mana ini bukan masalahnya, katakan saja dan saya akan mengedit jawaban saya. Perhatikan bahwa implementasi spesifik dapat menggunakan nama lain untuk objek-objek ini, seperti vektor dalam C ++ dan flex dalam ALGOL 68 (kedua daftar; flex secara teknis hanya array yang cukup besar).

Jika ada kebingungan yang tersisa dalam kasus Anda karena kekhususan cara +tanda bekerja di sini, ketahuilah bahwa pesanan penting untuk daftar dan kecuali ada alasan yang sangat baik untuk percaya, jika tidak, Anda dapat dengan mudah selalu menganggap bahwa operasi daftar menyimpan pesanan. . Dalam kasus ini, +tanda berperilaku seperti halnya string (yang sebenarnya hanyalah daftar karakter): ia mengambil konten daftar dan menempatkannya di belakang konten yang lain.

Jika sudah

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

Kemudian

list1 + list2

Sama dengan

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

Yang dievaluasi menjadi

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

Seperti

"abdcde" + "fghijk"

Menghasilkan

"abdcdefghijk"
ApproachingDarknessFish
sumber
1
Saya membaca di suatu tempat bahwa karena spesifikasi array JSON tidak menentukan bahwa array mempertahankan operasi array pesanan tidak dijamin untuk mempertahankan pesanan. Saya tidak dapat menemukan sumber untuk itu. Dan struktur yang mendasari Array masih merupakan kasus khusus dari sebuah objek dengan indeks bernomor, jadi itu bukan kontradiksi dengan pernyataan Anda, hanya berita gembira yang menarik, pikir saya.
Multihunter
1
Saya tidak setuju dengan penjelasan set. Set jelas tidak "diarahkan lebih ke arah tujuan matematika dan teoritis daripada yang nyata". Sebagai gantinya, set sangat berguna setiap saat seseorang membutuhkan koleksi yang berisi item yang tidak dapat diulang, dan menawarkan alat seperti perbedaan dan persimpangan yang berguna dalam memodelkan kasus penggunaan kehidupan nyata.
Pintun
1
@Pintun melihat ke belakang beberapa tahun setelah menulis posting ini, saya setuju dengan Anda. Saya akan mengedit begitu saya menemukan cara yang lebih baik untuk mengekspresikan apa yang saya tuju.
ApproachingDarknessFish
5

Anda membingungkan 'set' dan 'daftar'. Satu set tidak menjamin pesanan, tetapi daftar lakukan.

Set dinyatakan menggunakan kurung keriting: {}. Sebaliknya, daftar dinyatakan menggunakan kurung siku: [].

mySet = {a, b, c, c}

Tidak menjamin pesanan, tetapi daftar tidak:

myList = [a, b, c]
Jonathan Muckell
sumber
1
Perhatikan bahwa set juga menjamin non-duplikasi. Daftar mungkin memiliki elemen duplikat, satu set mungkin tidak.
Nathaniel Ford
4

Saya kira satu hal yang mungkin mengenai Anda adalah apakah entri dapat berubah atau tidak, sehingga 2 menjadi angka yang berbeda, misalnya. Anda dapat menenangkan pikiran Anda di sini, karena dengan Python, integer tidak dapat diubah , artinya dapat berubah setelah dibuat.

Namun, tidak semua yang ada di Python tidak dapat diubah. Sebagai contoh, daftar bisa berubah --- mereka dapat berubah setelah dibuat. Jadi misalnya, jika Anda memiliki daftar daftar

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

Di sini, saya mengubah entri pertama a(saya menambahkan7 ). Orang dapat membayangkan mengaduk-aduk berbagai hal, dan mendapatkan hal-hal yang tidak terduga di sini jika Anda tidak berhati-hati (dan memang, ini terjadi pada semua orang ketika mereka memulai pemrograman dengan Python dalam beberapa cara atau yang lain; cukup cari situs ini untuk "memodifikasi daftar sambil memutar melalui itu "untuk melihat lusinan contoh).

Ini juga layak untuk ditunjukkan x = x + [a]dan x.append(a)bukan hal yang sama. Yang kedua bermutasi x, dan yang pertama membuat daftar baru dan menugaskannya x. Untuk melihat perbedaannya, coba atur y = xsebelum menambahkan sesuatu ke xdan coba masing-masing, dan lihat perbedaan keduanya y.

penilai
sumber
0

aList = [1,2,3]

i = 0

for item in aList:  

    if i<2:  

            aList.remove(item)  

    i+=1  

sebuah daftar

[2]

Moralnya adalah ketika memodifikasi daftar dalam satu lingkaran yang didorong oleh daftar, mengambil dua langkah:

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]
anak laki-laki ralphie
sumber
0

Ya, daftar dan tupel selalu dipesan sedangkan kamus tidak

Ysh
sumber
1
Kecuali dalam Python 3: D
mbeacom