>>> 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?
>>> 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?
Câu trả lời:
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, y
cũng sẽ được cập nhật:
>>> x = [1, 2]
>>> y = x
>>> x += [3]
>>> x
[1, 2, 3]
>>> y
[1, 2, 3]
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)
.
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
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)
Đầu tiên là một danh sách, thứ hai là một tuple. Danh sách có thể thay đổi, bộ dữ liệu không.
Hãy xem phần Cấu trúc dữ liệu của hướng dẫn và phần Kiểu trình tự của tài liệu.
Các mục được phân tách bằng dấu phẩy được bao quanh bởi (
và )
là tuple
s, những mục được bao quanh bởi [
và ]
là list
s.
:P
(
và )
là tuple
s, những mục được bao quanh bởi [
và ]
là list
s."
(i for i in ...)
và[i for i in ...]
.