Sự khác biệt giữa các danh sách được bao quanh bởi dấu ngoặc vuông và dấu ngoặc đơn trong Python là gì?


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

Cả hai đều hợp lệ? Là một trong những lý do?


3
Chỉ cần FYI: có một sự khác biệt sâu sắc hơn giữa (i for i in ...)[i for i in ...].
Rik Poggi

2
@RikPoggi Sự khác biệt sâu sắc là gì? Bạn có thể vui lòng giải thích?
qazwsx

11
Cái đầu tiên là một biểu thức tạo và cái thứ hai là một sự hiểu biết danh sách . Bạn có thể tìm thấy một số thông tin ở đây: Hướng dẫn chính thức về Hiểu biết danh sách , PEP 289 . Và ở đây trong một số câu hỏi về HĐH: Biểu thức của Trình tạo so với Hiểu toàn diện , Hiểu về trình tạo .
Rik Poggi

Câu trả lời:


275

Dấu ngoặc vuông là danh sách trong khi dấu ngoặc đơn là bộ dữ liệu .

Một danh sách có thể thay đổi, có nghĩa là bạn có thể thay đổi nội dung của nó:

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

trong khi các bộ dữ liệu thì không:

>>> 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'

Sự khác biệt chính khác là một tuple có thể băm, có nghĩa là bạn có thể sử dụng nó như một chìa khóa cho một từ điển, trong số những thứ khác. Ví dụ:

>>> 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'

Lưu ý rằng, như nhiều người đã chỉ ra, bạn có thể thêm các bộ dữ liệu với nhau. Ví dụ:

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

Tuy nhiên, điều này không có nghĩa là bộ dữ liệu có thể thay đổi . Trong ví dụ trên, một bộ dữ liệu mới được xây dựng bằng cách thêm hai bộ dữ liệu làm đối số. Bộ dữ liệu gốc không được sửa đổi. Để chứng minh điều này, hãy xem xét những điều sau đây:

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

Trong khi đó, nếu bạn xây dựng ví dụ tương tự này với một danh sách, ycũng sẽ được cập nhật:

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

1
ví dụ tốt nhưng đơn giản để liệt kê ra sự khác biệt. Cảm ơn!
Tiến sĩ Essen

8

Một điểm khác biệt thú vị:

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)

Dấu phẩy phải được bao gồm trong một tuple ngay cả khi nó chỉ chứa một giá trị duy nhất. ví dụ (1,)thay vì (1).


Cảm ơn bạn. Đây là những gì tôi đang tìm kiếm. Mã tôi thấy có một (list1 + list2 + list3) và nó trả về một danh sách, không phải là một tuple.
HuckIt

4

Chúng không phải là danh sách, chúng là một danh sách và một tuple. Bạn có thể đọc về các bộ dữ liệu trong hướng dẫn Python. Mặc dù bạn có thể thay đổi danh sách, nhưng điều này là không thể với các bộ dữ liệu.

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

Một cách khác dấu ngoặc và dấu ngoặc đơn khác nhau là dấu ngoặc vuông có thể mô tả cách hiểu danh sách, ví dụ: [x for x in y]

Trong khi đó cú pháp ngoặc đơn tương ứng chỉ định một trình tạo tuple :(x for x in y)

Bạn có thể có được một tuple hiểu bằng cách sử dụng: tuple(x for x in y)

Xem: Tại sao không có sự hiểu biết tuple trong Python?



2

Các mục được phân tách bằng dấu phẩy được bao quanh bởi ()tuples, những mục được bao quanh bởi []lists.


1
Không có danh sách nào được bao quanh bởi dấu ngoặc "tròn", chúng là các bộ dữ liệu! Nhưng bạn có thể có nghĩa là điều đúng. :P
Gandaro

1
Danh sách được bao quanh bởi (và) là các bộ dữ liệu .. Tôi bối rối, chúng là danh sách hay bộ dữ liệu?
juliomalegria

@ julio.alegria Tôi nghĩ ý nghĩa của @FlopCoder là viết " Các mục được bao quanh bởi ()tuples, những mục được bao quanh bởi []lists."
funroll
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.