Apa perbedaan antara daftar yang dilingkupi oleh tanda kurung siku dan tanda kurung di Python?


174
>>> x=[1,2]
>>> x[1]
2
>>> x=(1,2)
>>> x[1]
2

Apakah keduanya valid? Apakah ada yang disukai karena alasan tertentu?


3
Hanya FYI: ada perbedaan yang lebih besar antara (i for i in ...)dan [i for i in ...].
Rik Poggi

2
@RikPoggi Apa perbedaannya? Bisakah Anda jelaskan?
qazwsx

11
Yang pertama adalah ekspresi generator dan yang kedua adalah daftar pemahaman . Anda dapat menemukan beberapa informasi di sini: Tutorial Resmi tentang Daftar Pemahaman , PEP 289 . Dan di sini, dalam beberapa pertanyaan OS: Ekspresi Generator vs. Pemahaman Daftar , pemahaman generator .
Rik Poggi

Jawaban:


275

Kurung kotak adalah daftar sementara tanda kurung adalah tupel .

Daftar bisa berubah, artinya Anda dapat mengubah isinya:

>>> x = [1,2]
>>> x.append(3)
>>> x
[1, 2, 3]

sedangkan tuple tidak:

>>> x = (1,2)
>>> x
(1, 2)
>>> x.append(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'

Perbedaan utama lainnya adalah bahwa tuple hashable, artinya Anda dapat menggunakannya sebagai kunci kamus, antara lain. Sebagai contoh:

>>> x = (1,2)
>>> y = [1,2]
>>> z = {}
>>> z[x] = 3
>>> z
{(1, 2): 3}
>>> z[y] = 4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

Perhatikan bahwa, seperti yang ditunjukkan oleh banyak orang, Anda dapat menambahkan tupel bersama-sama. Sebagai contoh:

>>> x = (1,2)
>>> x += (3,)
>>> x
(1, 2, 3)

Namun, ini tidak berarti tuple bisa berubah . Dalam contoh di atas, tuple baru dibangun dengan menambahkan bersama dua tupel sebagai argumen. Tuple asli tidak dimodifikasi. Untuk menunjukkan ini, pertimbangkan hal berikut:

>>> x = (1,2)
>>> y = x
>>> x += (3,)
>>> x
(1, 2, 3)
>>> y
(1, 2)

Sedangkan, jika Anda membangun contoh yang sama dengan daftar, yjuga akan diperbarui:

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

1
contoh yang bagus namun sederhana untuk menuliskan perbedaan. Terima kasih!
Dr. Essen

8

Satu perbedaan yang menarik:

lst=[1]
print lst          // prints [1]
print type(lst)    // prints <type 'list'>

notATuple=(1)
print notATuple        // prints 1
print type(notATuple)  // prints <type 'int'>
                                         ^^ instead of tuple(expected)

Koma harus dimasukkan dalam tupel walaupun hanya berisi satu nilai. misalnya (1,)bukannya (1).


Terima kasih. Ini yang saya cari. Kode yang saya lihat memiliki (list1 + list2 + list3) dan mengembalikan daftar, bukan tuple.
HuckIt

4

Mereka bukan daftar, mereka daftar dan tupel. Anda dapat membaca tentang tupel di tutorial Python. Meskipun Anda dapat mengubah daftar, ini tidak dimungkinkan dengan tupel.

In [1]: x = (1, 2)

In [2]: x[0] = 3
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/home/user/<ipython console> in <module>()

TypeError: 'tuple' object does not support item assignment

3

Cara lain tanda kurung dan kurung berbeda adalah bahwa tanda kurung siku dapat menggambarkan pemahaman daftar, misalnya [x for x in y]

Sedangkan sintaks kurung yang sesuai menentukan generator tuple :(x for x in y)

Anda bisa mendapatkan pemahaman tuple menggunakan: tuple(x for x in y)

Lihat: Mengapa tidak ada pemahaman tuple dalam Python?


2

Yang pertama adalah daftar, yang kedua adalah tupel. Daftar bisa berubah, tuple tidak.

Lihatlah bagian Struktur Data tutorial, dan bagian Jenis Urutan dokumentasi.


2

Dipisahkan koma item tertutup oleh (dan )adalah tuples, yang tertutup oleh [dan ]yang lists.


1
Tidak ada daftar yang terlampir oleh tanda kurung "bulat", itu adalah tupel! Tapi Anda mungkin bermaksud hal yang benar. :P
Gandaro

1
Daftar terlampir oleh (dan) adalah tupel .. Saya bingung, apakah daftar atau tupel?
juliomalegria

@ julio.alegria Saya pikir apa yang @FlopCoder dimaksudkan untuk menulis itu " Item tertutup oleh (dan )adalah tuples, yang tertutup oleh [dan ]merupakan lists."
funroll
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.