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.
"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.
+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
Harfiah
someTuple =(1,2)
someList =[1,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.
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
Pemakaian
Karena daftar bisa berubah, itu tidak dapat digunakan sebagai kunci dalam kamus, sedangkan tuple dapat digunakan.
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.
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:
Peningkatan kinerja yang sedikit.
Karena tuple tidak dapat diubah, tuple dapat digunakan sebagai kunci dalam kamus.
Jika Anda tidak dapat mengubahnya, tidak ada orang lain, yang artinya Anda tidak perlu khawatir tentang fungsi API dll. Mengubah tuple Anda tanpa diminta.
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
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.
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.
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.
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:
Duplikat - Kedua tupel dan daftar memungkinkan duplikat
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]
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.
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
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
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.
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"))
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.
Tuples dan daftar keduanya jenis urutan yang tampaknya sama dalam Python.
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]
Mutabilitas
Tuple tidak dapat diubah, sementara daftar dapat berubah. Titik ini adalah dasar untuk yang berikut.
Penggunaan memori
Karena mutabilitas, Anda memerlukan lebih banyak memori untuk daftar dan lebih sedikit memori untuk tupel.
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).
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
Semantik
Poin ini lebih tentang praktik terbaik. Anda harus menggunakan tupel sebagai struktur data yang heterogen, sementara daftar adalah urutan yang homogen.
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.
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.
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
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.
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.
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.
list
. ; DJawaban:
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:
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
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.
sumber
collections.namedtuple
lebih baik dipanggilcollections.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.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.Perbedaan antara daftar dan tupel
Harfiah
Ukuran
Karena ukuran operasi tuple yang lebih kecil, itu menjadi sedikit lebih cepat, tetapi tidak banyak untuk disebutkan sampai Anda memiliki sejumlah besar elemen.
Operasi yang diizinkan
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
Pemakaian
Karena daftar bisa berubah, itu tidak dapat digunakan sebagai kunci dalam kamus, sedangkan tuple dapat digunakan.
sumber
3. Permitted operation
menunjukkan case tuple terlebih dahulu. Saya tahu itu biasa untuk menunjukkan kesuksesan daripada kesalahan, tetapi itu mengacaukan kepala saya selama beberapa saat.one_item_list = [a]
, tetapione_tuple = (a,)
merupakan tupel yang sesuai. Perhatikan koma mengikuti nama variabel. Tapi perhatikan jugatwo_tuple = (a, b)
. Ini melemparkan saya lebih dari sekali (masih ada di Python 3).tuple(sorted(the_unsorted_tuple))
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.
sumber
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:
sumber
frozenset
atau 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, jadid[1, [2]]
akan dinaikkanTypeError: unhashable type: 'list'
).Daftar bisa berubah; tuple tidak.
Dari docs.python.org/2/tutorial/datastructures.html
sumber
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):
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.
sumber
type(a_list) != type(a_tuple)
, jadi setiap potongan kode perpustakaan yang didasarkan padatype(x)
akan berperilaku berbeda'%d %d' % [2, 3]
adalah aTypeError
, karena Anda mencoba meneruskan daftar ke yang pertama%d
dan Anda tidak memberikan nilai apa pun ke yang kedua%d
. (Namun, ada juga contoh tandingannya, sepertimax
...)Daftar untuk looping, tuple untuk struktur yaitu
"%s %s" %tuple
.Daftar biasanya homogen, tupel biasanya heterogen.
Daftar untuk panjang variabel, tuple untuk panjang tetap.
sumber
Ini adalah contoh daftar Python:
Ini adalah contoh Python tuple:
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:
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:
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.
Perbedaan: - A priori, menurut definisi
Sintaks - Daftar menggunakan [], tupel gunakan ()
Mutability - Elemen dalam daftar yang diberikan bisa berubah, elemen dalam tuple yang diberikan TIDAK bisa berubah.
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.
Perbedaan - Posteriori, dalam penggunaan
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.
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"))
sumber
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.
sumber
Perbedaan antara daftar dan tupel
Tuples dan daftar keduanya jenis urutan yang tampaknya sama dalam Python.
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.Mutabilitas
Tuple tidak dapat diubah, sementara daftar dapat berubah. Titik ini adalah dasar untuk yang berikut.
Penggunaan memori
Karena mutabilitas, Anda memerlukan lebih banyak memori untuk daftar dan lebih sedikit memori untuk tupel.
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).
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
Semantik
Poin ini lebih tentang praktik terbaik. Anda harus menggunakan tupel sebagai struktur data yang heterogen, sementara daftar adalah urutan yang homogen.
sumber
Daftar dimaksudkan untuk urutan yang homogen, sedangkan tupel adalah struktur data yang heterogen.
sumber
Seperti yang sudah dijawab orang di sini yang
tuples
tidak dapat diubah sementaralists
bisa berubah, tetapi ada satu aspek penting dalam menggunakan tuple yang harus kita ingatJika
tuple
mengandung alist
ataudictionary
di dalamnya, itu dapat diubah bahkan jikatuple
itu sendiri tidak berubah.Misalnya, mari kita asumsikan kita memiliki sebuah tuple yang berisi daftar dan kamus
kita dapat mengubah isi daftar sebagai
yang membuat tuple baru terlihat seperti
kami juga dapat mengubah kamus di dalam tuple sebagai
yang akan membuat tuple keseluruhan terlihat seperti
Ini terjadi karena
list
dandictionary
adalah benda-benda dan benda-benda ini tidak berubah, tapi isi menunjuk ke.Jadi
tuple
tetap tidak berubah tanpa kecualisumber
The PEP 484 - Type Hints mengatakan bahwa tipe elemen a
tuple
dapat diketik secara individual; sehingga Anda bisa mengatakanTuple[str, int, float]
; tetapi alist
, denganList
kelas pengetikan hanya dapat mengambil satu tipe parameterList[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
.sumber
Karena orang telah menyebutkan perbedaannya, saya akan menulis tentang mengapa tuple.
Mengapa tuple lebih disukai?
Sumber: https://rushter.com/blog/python-lists-and-tuples/
Mengapa tuple lebih efisien daripada daftar? -> https://stackoverflow.com/a/22140115
sumber
Kutipan arah dari dokumentasi pada 5.3. Tuples and Sequences :
sumber
Pertama-tama, mereka berdua adalah objek non-skalar (juga dikenal sebagai objek gabungan) dalam Python.
+
(tuple baru akan dibuat tentu saja)(3,) # -> (3)
bukan(3) # -> 3
[3]
new_array = origin_array[:]
[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).
sumber
Daftar bisa berubah dan tuple tidak berubah. Perhatikan saja contoh ini.
Sekarang ubah nilai indeks daftar dan tupel.
Karenanya terbukti kode berikut tidak valid dengan tuple, karena kami berusaha memperbarui tuple, yang tidak diizinkan.
sumber
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.
sumber