Apa perbedaan antara daftar dan tupel?

1020

Apa bedanya?

Apa kelebihan / kekurangan tupel / daftar?

Lucas Gabriel Sánchez
sumber
13
Yang lain menjawab di bawah, tetapi saya ingin menunjukkan, bahwa, imho, python memiliki nama tipe data yang sama sekali tidak intuitif. Saya tidak berpikir bahasa lain memiliki tupel (dengan nama itu), dan apa yang lebih buruk sebagai kata saya bahkan tidak bisa menerjemahkannya dalam bahasa saya. Adakah yang tahu dari mana "tuple" berasal? Belanda?
Benteng
98
Tuples adalah istilah dasar dalam matematika, berasal dari bahasa latin (lihat wikipedia).
nikow
129
pair -> triple -> quadruple -> quintuple -> sextuple -> um, apa namanya, ah sod it, 7-tuple -> 8-tuple -> ... maka 'tuple' sebagai nama generik.
John Fouhy
31
@ JohnFouhy Sudah lebih dari enam tahun kemudian, tetapi: ... heptuple, octuple, tuple-with-sembilan-elements, decuple, undecuple, dodecuple ...: D
Augusta
18
@MegaWidget saya pikir kami telah menetapkan bahwa non-orang adalah seorang list. ; D
Augusta

Jawaban:

1017

Selain tuple yang tidak berubah ada juga perbedaan semantik yang harus memandu penggunaannya. Tuples adalah struktur data yang heterogen (yaitu, entri mereka memiliki arti yang berbeda), sedangkan daftar adalah urutan homogen. Tuples memiliki struktur, daftar memiliki urutan.

Menggunakan perbedaan ini membuat kode lebih eksplisit dan mudah dipahami.

Salah satu contoh adalah pasangan nomor halaman dan garis untuk lokasi referensi dalam sebuah buku, misalnya:

my_location = (42, 11)  # page number, line number

Anda kemudian dapat menggunakan ini sebagai kunci dalam kamus untuk menyimpan catatan di lokasi. Daftar di sisi lain dapat digunakan untuk menyimpan banyak lokasi. Secara alami seseorang mungkin ingin menambah atau menghapus lokasi dari daftar, jadi masuk akal bahwa daftar bisa berubah. Di sisi lain, tidak masuk akal untuk menambahkan atau menghapus item dari lokasi yang ada - maka tuple tidak dapat diubah.

Mungkin ada situasi di mana Anda ingin mengubah item dalam tuple lokasi yang ada, misalnya saat beralih melalui baris halaman. Tetapi tuple immutability memaksa Anda untuk membuat tuple lokasi baru untuk setiap nilai baru. Ini tampaknya tidak nyaman di muka itu, tetapi menggunakan data abadi seperti ini adalah landasan jenis nilai dan teknik pemrograman fungsional, yang dapat memiliki keuntungan besar.

Ada beberapa artikel menarik tentang masalah ini, misalnya "Python Tuples Bukan Hanya Daftar Konstan" atau "Memahami tupel vs daftar dengan Python" . Dokumentasi Python resmi juga menyebutkan ini

"Tuples tidak berubah, dan biasanya mengandung urutan heterogen ...".

Dalam bahasa yang diketik secara statis seperti Haskell nilai-nilai dalam sebuah tuple umumnya memiliki tipe yang berbeda dan panjang tuple harus diperbaiki. Dalam daftar, semua nilai memiliki tipe yang sama dan panjangnya tidak tetap. Jadi perbedaannya sangat jelas.

Akhirnya ada namesuple di Python, yang masuk akal karena tuple sudah seharusnya memiliki struktur. Ini menggarisbawahi gagasan bahwa tuple adalah alternatif yang ringan untuk kelas dan instance.

nikow
sumber
11
+1, terutama untuk tautan kedua Anda dengan contoh yang bagus. Suka kutipan ini: "Ini tuple berfungsi sebagai catatan ringan atau struct."
Baltimark
105
"daftar adalah urutan yang homogen" - Saya baru mengenal Python, tetapi bukankah daftar itu heterogen? Dari docs.python.org/py3k/tutorial/introduction.html : "Daftar item tidak harus semuanya memiliki tipe yang sama." Tapi mungkin Anda berbicara tentang konsep formal, dan bukan Python yang mengambilnya.
Matthew Cornell
13
Sinonim semantik yang bagus untuk "tuple" mungkin "record." Ini adalah kumpulan item data terkait dalam urutan tertentu. Bahkan saya merasa collections.namedtuplelebih baik dipanggil collections.record. Tidak masuk akal untuk bertukar, katakanlah, nama dan alamat dalam catatan pelanggan; pada kenyataannya, melakukan hal itu biasanya merupakan kesalahan, yang ketidakmampuan tuple mencegah Anda melakukan.
kindall
4
@nikow: Mengenai What would you do with such a list?, saya selalu menggigil ketika ppl menggunakan kurangnya fantasi sebagai argumen. Menggunakan daftar tipe campuran bekerja sangat baik misalnya untuk beberapa struktur data hierarkis, di mana setiap daftar terdiri dari daftar anak dan elemen nilai.
Sebastian Mach
18
Bukankah salah untuk mengatakan bahwa tupel itu heterogen dan daftarnya homogen? Misalnya daftar dapat memiliki campuran dari tipe data yang berbeda yaitu l = [1, 2, 'a']. Saya tidak mengerti apa yang Anda bicarakan.
Celeritas
362

Perbedaan antara daftar dan tupel

  1. Harfiah

    someTuple = (1,2)
    someList  = [1,2] 
  2. Ukuran

    a = tuple(range(1000))
    b = list(range(1000))
    
    a.__sizeof__() # 8024
    b.__sizeof__() # 9088

    Karena ukuran operasi tuple yang lebih kecil, itu menjadi sedikit lebih cepat, tetapi tidak banyak untuk disebutkan sampai Anda memiliki sejumlah besar elemen.

  3. Operasi yang diizinkan

    b    = [1,2]   
    b[0] = 3       # [3, 2]
    
    a    = (1,2)
    a[0] = 3       # Error

    Itu juga berarti bahwa Anda tidak dapat menghapus elemen atau mengurutkan tuple. Namun, Anda bisa menambahkan elemen baru ke daftar dan tuple dengan satu-satunya perbedaan bahwa karena tuple tidak berubah, Anda tidak benar - benar menambahkan elemen tetapi Anda membuat tuple baru, sehingga id akan berubah

    a     = (1,2)
    b     = [1,2]  
    
    id(a)          # 140230916716520
    id(b)          # 748527696
    
    a   += (3,)    # (1, 2, 3)
    b   += [3]     # [1, 2, 3]
    
    id(a)          # 140230916878160
    id(b)          # 748527696
  4. Pemakaian

    Karena daftar bisa berubah, itu tidak dapat digunakan sebagai kunci dalam kamus, sedangkan tuple dapat digunakan.

    a    = (1,2)
    b    = [1,2] 
    
    c = {a: 1}     # OK
    c = {b: 1}     # Error
Nikita
sumber
Jadi apa yang terjadi ketika saya mencoba mengubah ukuran ukuran daftar menjadi nilai besar? Apakah ini akan mengubah alamat memori (yang saya percaya harus mengubah id). Atau akankah itu membuat saya kesalahan?
WanderingMind
17
@WanderingMind: alamat memori tempat nilai daftar disimpan tidak sama dengan alamat memori tempat objek daftar itu sendiri disimpan.
Tom
2
Hmmm ... semua kode dalam posting ini kecuali kotak pertama di bawah 3. Permitted operationmenunjukkan case tuple terlebih dahulu. Saya tahu itu biasa untuk menunjukkan kesuksesan daripada kesalahan, tetapi itu mengacaukan kepala saya selama beberapa saat.
dmckee --- ex-moderator kitten
1
Seperti yang ditunjukkan pada poin 3, daftar elemen tunggal bisa one_item_list = [a], tetapi one_tuple = (a,)merupakan tupel yang sesuai. Perhatikan koma mengikuti nama variabel. Tapi perhatikan juga two_tuple = (a, b). Ini melemparkan saya lebih dari sekali (masih ada di Python 3).
mjkrause
1
@Cheng Karena menyortir tuple akan mengubahnya, yaitu, ganti itemnya. Tuples tidak mendukung itu. Cara paling sederhana untuk mendapatkan tuple yang diurutkan dalam python adalahtuple(sorted(the_unsorted_tuple))
ApproachingDarknessFish
204

Jika Anda berjalan-jalan, Anda bisa mencatat koordinat Anda kapan saja dalam sebuah (x,y)tuple.

Jika Anda ingin merekam perjalanan Anda, Anda dapat menambahkan lokasi Anda setiap beberapa detik ke daftar.

Tetapi Anda tidak bisa melakukannya sebaliknya.

dan-gph
sumber
37
Contoh ini sepertinya hanya sebuah konvensi. Orang-orang dapat berdebat "Saya masih bisa menggunakan [x, y] untuk mencatat koordinat jika saya mau". Oleh karena itu, jawaban ini dianggap tidak lengkap kecuali satu kalimat lagi: "Baca posting @nikow mengapa Anda tidak boleh menggunakan daftar untuk menyimpan koordinat"
RayLuo
71
@Iceberg, jawaban saya dimaksudkan untuk membantu mengembangkan intuisi. Itu tidak dimaksudkan untuk mengeksplorasi setiap nuansa topik.
dan-gph
8
Contoh bagus +1. Ini menekankan sifat komplementer dari elemen tuple (di sini koordinat), yang merupakan alasan mengapa memodifikasi salah satu dari mereka tidak diperbolehkan - karena itu mengubah makna seluruh tuple (di sini posisi satu titik).
Hao Wang
77

Perbedaan utama adalah bahwa tuple tidak dapat diubah. Ini berarti bahwa Anda tidak dapat mengubah nilai-nilai dalam sebuah tuple setelah Anda membuatnya.

Jadi, jika Anda perlu mengubah nilai, gunakan Daftar.

Manfaat untuk tuple:

  1. Peningkatan kinerja yang sedikit.
  2. Karena tuple tidak dapat diubah, tuple dapat digunakan sebagai kunci dalam kamus.
  3. Jika Anda tidak dapat mengubahnya, tidak ada orang lain, yang artinya Anda tidak perlu khawatir tentang fungsi API dll. Mengubah tuple Anda tanpa diminta.
Dave Webb
sumber
14
Perhatikan bahwa tupel hanya tidak berubah jika semua elemennya . Anda bisa mengatakan hal yang sama berlaku untuk semua koleksi abadi, seperti frozensetatau berbagai dikte / pohon beku pihak ketiga lainnya. jenis, tetapi tidak ada yang memungkinkan Anda untuk menambahkan elemen yang bisa berubah. (Dan tentu saja tuple hanya dapat dip hash jika semua elemennya, yang menangani dengan cara EAFP biasa, jadi d[1, [2]]akan dinaikkan TypeError: unhashable type: 'list').
abarnert
1
Sebuah tuple hanya dapat digunakan sebagai kunci dalam kamus jika semua elemennya tidak berubah. Lihat di sini
Will Dereham
31

Daftar bisa berubah; tuple tidak.

Dari docs.python.org/2/tutorial/datastructures.html

Tuples tidak dapat diubah, dan biasanya berisi urutan elemen yang heterogen yang diakses melalui pembongkaran (lihat nanti di bagian ini) atau pengindeksan (atau bahkan berdasarkan atribut dalam kasus namesuple). Daftar bisa berubah, dan unsur-unsurnya biasanya homogen dan diakses dengan mengulangi daftar.

Duffymo
sumber
1
Saya benar-benar berpikir Anda juga harus mempertimbangkan implikasi semantik (lihat jawaban saya di bawah).
nikow
Tampaknya tidak sepadan dengan usaha sekarang, tetapi terima kasih atas perhatiannya.
duffymo
Enam bulan kemudian, dan hanya ini yang bisa Anda sumbangkan? Saya memberikan jawaban itu pada saat itu karena dalam empat jam yang berlalu antara jawaban asli saya dan komentar orang lain telah lebih dari membuat perbedaan. Apakah jawabannya salah? Tidak juga, meskipun sudah diperbaiki oleh nikow. Jadi apa yang akan ditambahkan oleh tautan?
duffymo
4
Lucu melihat jawaban lain di sini memiliki kualitas yang sama seperti ini, tetapi hanya ini yang dibenci karena satu komentator yang menyatakan "-1". Dan ada jawaban lain yang hanya memiliki 0,5 kali kualitas, tetapi hanya 0,1 kali downvotes.
Sebastian Mach
2
@duffymo Saya pikir jawaban ini adalah yang paling jelas dan paling ringkas di halaman ini. Ini menamai satu-satunya perbedaan yang sangat penting antara tupel dan daftar dan tidak mengoceh tanpa henti tentang omong kosong homogen-vs-heterogen yang benar-benar palsu ini.
antred
20

Telah disebutkan bahwa perbedaannya sebagian besar bersifat semantik: orang mengharapkan tuple dan daftar untuk mewakili informasi yang berbeda. Tapi ini lebih dari sekadar panduan; beberapa perpustakaan benar-benar berperilaku berbeda berdasarkan apa yang disahkan. Ambil NumPy sebagai contoh (disalin dari pos lain tempat saya meminta lebih banyak contoh):

>>> import numpy as np
>>> a = np.arange(9).reshape(3,3)
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> idx = (1,1)
>>> a[idx]
4
>>> idx = [1,1]
>>> a[idx]
array([[3, 4, 5],
       [3, 4, 5]])

Intinya adalah, meskipun NumPy mungkin bukan bagian dari perpustakaan standar, ini adalah a pustaka Python utama , dan dalam daftar NumPy dan tupel adalah hal yang sangat berbeda.

Shep
sumber
2
Ini bukan jawaban yang sangat membantu. Perbedaannya adalah bahwa type(a_list) != type(a_tuple), jadi setiap potongan kode perpustakaan yang didasarkan pada type(x)akan berperilaku berbeda
Eric
1
Bagus, saya sudah mengedit posting: ini benar-benar hanya menunjukkan bahwa pedoman semantik di-hardcode ke beberapa perpustakaan.
Shep
1
Mungkin lebih baik menggunakan contoh dari stdlib / builtin daripada dari perpustakaan pihak ketiga. Ada sejumlah tempat di mana Anda dapat menggunakan nilai tunggal atau tupel nilai, dan daftar atau urutan lainnya dianggap sebagai nilai tunggal. Misalnya, '%d %d' % [2, 3]adalah a TypeError, karena Anda mencoba meneruskan daftar ke yang pertama %ddan Anda tidak memberikan nilai apa pun ke yang kedua %d. (Namun, ada juga contoh tandingannya, seperti max...)
abarnert
itu menarik, saya tidak tahu ada contoh ini di perpustakaan standar python. Sejumlah tempat yang Anda katakan?
Shep
18

Daftar untuk looping, tuple untuk struktur yaitu "%s %s" %tuple .

Daftar biasanya homogen, tupel biasanya heterogen.

Daftar untuk panjang variabel, tuple untuk panjang tetap.

Srinivas Reddy Thatiparthy
sumber
16

Ini adalah contoh daftar Python:

my_list = [0,1,2,3,4]
top_rock_list = ["Bohemian Rhapsody","Kashmir","Sweet Emotion", "Fortunate Son"]

Ini adalah contoh Python tuple:

my_tuple = (a,b,c,d,e)
celebrity_tuple = ("John", "Wayne", 90210, "Actor", "Male", "Dead")

Daftar dan tupel Python serupa karena keduanya merupakan kumpulan nilai yang dipesan. Selain perbedaan dangkal yang dibuat daftar menggunakan tanda kurung "[..., ...]" dan tupel menggunakan tanda kurung "(..., ...)", inti teknis "hard coded in Python syntax" perbedaan di antara mereka adalah bahwa elemen-elemen dari tuple tertentu tidak dapat diubah sedangkan daftar dapat berubah (... jadi hanya tuple yang dapat hashable dan dapat digunakan sebagai kamus / kunci hash!). Hal ini menimbulkan perbedaan dalam bagaimana mereka dapat atau tidak dapat digunakan (ditegakkan secara apriori oleh sintaksis) dan perbedaan dalam bagaimana orang memilih untuk menggunakannya (didorong sebagai 'praktik terbaik,' a posteriori, inilah yang dilakukan oleh para programmer yang pintar ). orang memberi pada urutan elemen.

Untuk tupel, 'pesanan' tidak lebih dari sekadar 'struktur' spesifik untuk menyimpan informasi. Nilai apa yang ditemukan di bidang pertama dapat dengan mudah beralih ke bidang kedua karena masing-masing memberikan nilai di dua dimensi atau skala yang berbeda. Mereka memberikan jawaban untuk berbagai jenis pertanyaan dan biasanya dalam bentuk: untuk objek / subjek tertentu, apa atributnya? Objek / subjek tetap konstan, atributnya berbeda.

Untuk daftar, 'pesanan' menandakan urutan atau arah. Elemen kedua HARUS datang setelah elemen pertama karena diposisikan di tempat ke-2 berdasarkan skala atau dimensi tertentu dan umum. Unsur-unsur diambil secara keseluruhan dan sebagian besar memberikan jawaban untuk satu pertanyaan yang biasanya berupa, untuk atribut yang diberikan, bagaimana objek / subjek ini dibandingkan? Atribut tetap konstan, objek / subjek berbeda.

Ada banyak contoh orang dalam budaya populer dan pemrogram yang tidak sesuai dengan perbedaan-perbedaan ini dan ada banyak orang yang mungkin menggunakan garpu salad untuk hidangan utama mereka. Pada akhirnya, tidak masalah dan keduanya biasanya dapat menyelesaikan pekerjaan.

Untuk meringkas beberapa detail yang lebih baik

Kesamaan:

  1. Duplikat - Kedua tupel dan daftar memungkinkan duplikat
  2. Pengindeksan, Memilih, & Mengiris - Kedua tupel dan daftar indeks menggunakan nilai integer yang ditemukan dalam kurung. Jadi, jika Anda menginginkan 3 nilai pertama dari daftar atau tuple yang diberikan, sintaksnya akan sama:

    >>> my_list[0:3]
    [0,1,2]
    >>> my_tuple[0:3]
    [a,b,c]
  3. Membandingkan & Menyortir - Dua tupel atau dua daftar keduanya dibandingkan oleh elemen pertama mereka, dan jika ada dasi, maka oleh elemen kedua, dan seterusnya. Tidak ada perhatian lebih lanjut diberikan pada elemen berikutnya setelah elemen sebelumnya menunjukkan perbedaan.

    >>> [0,2,0,0,0,0]>[0,0,0,0,0,500]
    True
    >>> (0,2,0,0,0,0)>(0,0,0,0,0,500)
    True

Perbedaan: - A priori, menurut definisi

  1. Sintaks - Daftar menggunakan [], tupel gunakan ()

  2. Mutability - Elemen dalam daftar yang diberikan bisa berubah, elemen dalam tuple yang diberikan TIDAK bisa berubah.

    # Lists are mutable:
    >>> top_rock_list
    ['Bohemian Rhapsody', 'Kashmir', 'Sweet Emotion', 'Fortunate Son']
    >>> top_rock_list[1]
    'Kashmir'
    >>> top_rock_list[1] = "Stairway to Heaven"
    >>> top_rock_list
    ['Bohemian Rhapsody', 'Stairway to Heaven', 'Sweet Emotion', 'Fortunate Son']
    
    # Tuples are NOT mutable:       
    >>> celebrity_tuple
    ('John', 'Wayne', 90210, 'Actor', 'Male', 'Dead')
    >>> celebrity_tuple[5]
    'Dead'
    >>> celebrity_tuple[5]="Alive"
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment
  3. Hashtable (Kamus) - Sebagai hashtable (kamus) mensyaratkan bahwa kuncinya dapat di hashable dan karenanya tidak dapat diubah, hanya tuple yang dapat bertindak sebagai kunci kamus, bukan daftar.

    #Lists CAN'T act as keys for hashtables(dictionaries)
    >>> my_dict = {[a,b,c]:"some value"}
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'
    
    #Tuples CAN act as keys for hashtables(dictionaries)
    >>> my_dict = {("John","Wayne"): 90210}
    >>> my_dict
    {('John', 'Wayne'): 90210}

Perbedaan - Posteriori, dalam penggunaan

  1. Homo vs Heterogenitas Elemen - Umumnya objek daftar adalah homogen dan objek tupel heterogen. Artinya, daftar digunakan untuk objek / subjek dengan tipe yang sama (seperti semua kandidat presiden, atau semua lagu, atau semua pelari) sedangkan walaupun itu tidak dipaksakan oleh), sedangkan tupel lebih untuk objek heterogen.

  2. Looping vs. Structures - Meskipun keduanya memungkinkan untuk diulang (untuk x di my_list ...), itu hanya masuk akal untuk melakukannya untuk daftar. Tuples lebih sesuai untuk menyusun dan menyajikan informasi (% s% s berada di% s adalah% s dan saat ini% s% ("John", "Wayne", 90210, "Aktor", "Mati"))

Semangat
sumber
Saya suka contoh hashtable / hashable untuk menjelaskan alasan immutability - Anda dapat menggunakan tuple (catatan / struct / koordinat / vektor / titik) sebagai kunci kompleks menjadi dict.
Dave X
9

Nilai daftar dapat diubah kapan saja tetapi nilai tupel tidak dapat diubah.

The kelebihan dan kekurangan tergantung pada penggunaan. Jika Anda memiliki data yang tidak ingin Anda ubah maka Anda harus menggunakan tuple, jika tidak daftar adalah pilihan terbaik.

kebiruan
sumber
7

Perbedaan antara daftar dan tupel

Tuples dan daftar keduanya jenis urutan yang tampaknya sama dalam Python.

  1. Sintaks literal

    Kami menggunakan tanda kurung ( ) untuk membuat tupel dan tanda kurung siku [ ]untuk mendapatkan daftar baru. Juga, kita dapat menggunakan panggilan dari tipe yang sesuai untuk mendapatkan struktur yang dibutuhkan - tuple atau daftar.

    someTuple = (4,6)
    someList  = [2,6] 
  2. Mutabilitas

    Tuple tidak dapat diubah, sementara daftar dapat berubah. Titik ini adalah dasar untuk yang berikut.

  3. Penggunaan memori

    Karena mutabilitas, Anda memerlukan lebih banyak memori untuk daftar dan lebih sedikit memori untuk tupel.

  4. Memperluas

    Anda dapat menambahkan elemen baru ke kedua tupel dan daftar dengan satu-satunya perbedaan bahwa id tupel akan diubah (yaitu, kita akan memiliki objek baru).

  5. Hashing

    Tuples hashable dan daftarnya tidak. Ini berarti bahwa Anda dapat menggunakan tuple sebagai kunci dalam kamus. Daftar tidak dapat digunakan sebagai kunci dalam kamus, sedangkan tuple dapat digunakan

    tup      = (1,2)
    list_    = [1,2] 
    
    c = {tup   : 1}     # ok
    c = {list_ : 1}     # error
  6. Semantik

    Poin ini lebih tentang praktik terbaik. Anda harus menggunakan tupel sebagai struktur data yang heterogen, sementara daftar adalah urutan yang homogen.

iNet
sumber
1
Pilihan saya di sini untuk diskusi eksplisit ekstensi dan hashing, yang saya tidak perhatikan dalam jawaban yang sudah ada yang sangat baik.
dmckee --- ex-moderator kitten
6

Daftar dimaksudkan untuk urutan yang homogen, sedangkan tupel adalah struktur data yang heterogen.

pquers
sumber
26
Pada titik ini, jawaban ini tidak menambah apa pun pada diskusi, karena ada banyak jawaban lain yang lebih baik.
Jonathon Reinhart
5

Seperti yang sudah dijawab orang di sini yang tuplestidak dapat diubah sementara listsbisa berubah, tetapi ada satu aspek penting dalam menggunakan tuple yang harus kita ingat

Jika tuplemengandung alist atau dictionarydi dalamnya, itu dapat diubah bahkan jika tupleitu sendiri tidak berubah.

Misalnya, mari kita asumsikan kita memiliki sebuah tuple yang berisi daftar dan kamus

my_tuple = (10,20,30,[40,50],{ 'a' : 10})

kita dapat mengubah isi daftar sebagai

my_tuple[3][0] = 400
my_tuple[3][1] = 500

yang membuat tuple baru terlihat seperti

(10, 20, 30, [400, 500], {'a': 10})

kami juga dapat mengubah kamus di dalam tuple sebagai

my_tuple[4]['a'] = 500

yang akan membuat tuple keseluruhan terlihat seperti

(10, 20, 30, [400, 500], {'a': 500})

Ini terjadi karena list dan dictionaryadalah benda-benda dan benda-benda ini tidak berubah, tapi isi menunjuk ke.

Jadi tupletetap tidak berubah tanpa kecuali

Daksh
sumber
Posting ini akan ditingkatkan jika Anda menjelaskan bahwa "itu dapat diubah bahkan jika tuple itu sendiri dalam kekekalan." karena objek tersebut mempertahankan identitasnya sementara (jadi tupel tidak berubah karena masih berisi objek yang sama ...).
dmckee --- ex-moderator kitten
3

The PEP 484 - Type Hints mengatakan bahwa tipe elemen a tupledapat diketik secara individual; sehingga Anda bisa mengatakan Tuple[str, int, float]; tetapi a list, dengan Listkelas pengetikan hanya dapat mengambil satu tipe parameter List[str]:, yang mengisyaratkan bahwa perbedaan dari 2 sebenarnya adalah bahwa yang pertama adalah heterogen, sedangkan yang terakhir pada dasarnya homogen.

Juga, pustaka standar sebagian besar menggunakan tupel sebagai nilai balik dari fungsi standar tersebut di mana C akan mengembalikan a struct.

Antti Haapala
sumber
3

Karena orang telah menyebutkan perbedaannya, saya akan menulis tentang mengapa tuple.

Mengapa tuple lebih disukai?

Pengoptimalan alokasi untuk tupel kecil

Untuk mengurangi fragmentasi memori dan mempercepat alokasi, Python menggunakan kembali tupel lama. Jika sebuah tuple tidak lagi diperlukan dan memiliki kurang dari 20 item alih-alih menghapusnya secara permanen, Python memindahkannya ke daftar gratis.

Daftar gratis dibagi menjadi 20 grup, di mana setiap grup mewakili daftar panjang tupel n antara 0 dan 20. Setiap grup dapat menyimpan hingga 2.000 tupel. Grup pertama (nol) hanya berisi 1 elemen dan mewakili tuple kosong.

>>> a = (1,2,3)
>>> id(a)
4427578104
>>> del a
>>> b = (1,2,4)
>>> id(b)
4427578104

Pada contoh di atas kita dapat melihat bahwa a dan b memiliki id yang sama. Itu karena kami segera menduduki tuple hancur yang ada di daftar gratis.

Pengoptimalan alokasi untuk daftar

Karena daftar dapat dimodifikasi, Python tidak menggunakan optimasi yang sama seperti pada tupel. Namun, daftar Python juga memiliki daftar gratis, tetapi hanya digunakan untuk objek kosong. Jika daftar kosong dihapus atau dikumpulkan oleh GC, itu dapat digunakan kembali nanti.

>>> a = []
>>> id(a)
4465566792
>>> del a
>>> b = []
>>> id(b)
4465566792

Sumber: https://rushter.com/blog/python-lists-and-tuples/

Mengapa tuple lebih efisien daripada daftar? -> https://stackoverflow.com/a/22140115

Pygirl
sumber
2

Kutipan arah dari dokumentasi pada 5.3. Tuples and Sequences :

Meskipun tupel mungkin mirip dengan daftar, tupel sering digunakan dalam situasi yang berbeda dan untuk tujuan yang berbeda. Tuples tidak dapat diubah , dan biasanya berisi urutan elemen yang heterogen yang diakses melalui pembongkaran (lihat nanti di bagian ini) atau pengindeksan (atau bahkan berdasarkan atribut dalam kasus namesuple). Daftar bisa berubah , dan unsur-unsurnya biasanya homogen dan diakses dengan mengulangi daftar.

Albus Dumbledore
sumber
1

Pertama-tama, mereka berdua adalah objek non-skalar (juga dikenal sebagai objek gabungan) dalam Python.

  • Tuples, urutan elemen berurutan (yang dapat berisi objek apa pun tanpa masalah alias)
    • Abadi (tuple, int, float, str)
    • Penggabungan menggunakan +(tuple baru akan dibuat tentu saja)
    • Pengindeksan
    • Mengiris
    • Singleton (3,) # -> (3)bukan(3) # -> 3
  • Daftar (Array dalam bahasa lain), urutan nilai yang diurutkan
    • Yg mungkin berubah
    • Singleton [3]
    • Kloning new_array = origin_array[:]
    • Pemahaman daftar [x**2 for x in range(1,7)]memberi Anda [1,4,9,16,25,36](Tidak terbaca)

Menggunakan daftar juga dapat menyebabkan bug aliasing (dua jalur berbeda yang menunjuk ke objek yang sama).

Lorem Ipsum Dolor
sumber
0

Daftar bisa berubah dan tuple tidak berubah. Perhatikan saja contoh ini.

a = ["1", "2", "ra", "sa"]    #list
b = ("1", "2", "ra", "sa")    #tuple

Sekarang ubah nilai indeks daftar dan tupel.

a[2] = 1000
print a     #output : ['1', '2', 1000, 'sa']
b[2] = 1000
print b     #output : TypeError: 'tuple' object does not support item assignment.

Karenanya terbukti kode berikut tidak valid dengan tuple, karena kami berusaha memperbarui tuple, yang tidak diizinkan.

Rahul Sawriya
sumber
-1

Daftar bisa berubah dan tuple tidak berubah. Perbedaan utama antara bisa berubah dan tidak dapat diubah adalah penggunaan memori ketika Anda mencoba untuk menambahkan item.

Saat Anda membuat variabel, beberapa memori tetap ditugaskan ke variabel. Jika itu daftar, lebih banyak memori yang diberikan daripada yang sebenarnya digunakan. Misal, jika penugasan memori saat ini adalah 100 byte, ketika Anda ingin menambahkan byte ke 101, mungkin 100 byte lainnya akan ditetapkan (total 200 byte dalam kasus ini).

Namun, jika Anda tahu bahwa Anda tidak sering menambahkan elemen baru, maka Anda harus menggunakan tuple. Tuples menetapkan ukuran persis dari memori yang dibutuhkan, dan karenanya menghemat memori, terutama ketika Anda menggunakan blok memori yang besar.

Tony
sumber
2
Meskipun beberapa di antaranya secara teknis benar, itu tidak benar-benar perbedaan penting antara tipe yang bisa berubah dan tidak berubah. Perbedaan yang lebih besar adalah bahwa tipe yang dapat berubah dapat diubah setelah konstruksi, sedangkan tipe yang tidak dapat diubah tidak dapat diubah.
Roger Fan
1
Itu juga bukan alasannya. Memori dan kemampuan berubah-ubah tidak ada hubungannya dengan satu sama lain. Itu hanyalah detail implementasi khusus untuk daftar. Memori juga tidak ditugaskan ke variabel, itu ditugaskan ke objek. Variabel kemudian hanya referensi ke objek-objek itu.
Roger Fan