Menu

Tuple trong Python: dãy bất biến, giải nén và named tuple

Khi nào nên dùng tuple thay vì list: tính bất biến, giải nén, named tuple và những tình huống tuple được sinh ra để giải quyết.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Tuple là list không thể thay đổi

Thoạt nhìn tuple và list khá giống nhau: cả hai đều là dãy có thứ tự, đều hỗ trợ truy cập theo chỉ số và duyệt qua, nhưng có một khác biệt then chốt làm thay đổi mọi thứ: tuple là bất biến. Khi đã tạo một tuple, bạn không thể thêm vào, xóa đi hay thay một phần tử.

Bạn viết tuple bằng dấu ngoặc tròn (đôi khi không cần ngoặc):

Tuple có một phần tử cần thêm dấu phẩy ở cuối, nếu không Python sẽ coi dấu ngoặc chỉ là để nhóm biểu thức:

Còn tuple rỗng thì dùng ():

Tính bất biến trong thực tế

Thử thay đổi một tuple và Python sẽ chặn bạn lại:

Bạn có thể đọc từ tuple thoải mái: truy cập theo chỉ số, cắt, duyệt, dùng in. Chỉ là không thể sửa nó. Nếu cần một tuple khác, bạn tạo một tuple mới.

Sao lại muốn một thứ không thể thay đổi?

Bất biến nghe như một hạn chế, nhưng thường lại chính là tính năng bạn cần.

  1. An toàn. Một tuple bạn truyền vào hàm không thể bị sửa sau lưng bạn.
  2. Hashable. Tuple chứa các giá trị bất biến có thể dùng làm khóa của từ điển hoặc phần tử của set; list thì không.
  3. Ý đồ rõ ràng. Tuple nói rằng "đây là một bản ghi có hình dạng cố định". point = (3, 4) truyền tải ý "hai tọa độ" rõ hơn point = [3, 4].

Tuple tỏa sáng ở những chỗ như:

  • Tọa độ: (x, y), (lat, lon)
  • Màu RGB: (255, 128, 0)
  • Bản ghi: (name, email, signup_date)
  • Trả về nhiều giá trị từ một hàm

Giải nén

Tuple và cú pháp giải nén (unpacking) sinh ra là để dành cho nhau:

Dấu phẩy ở vế trái chính là thứ thực hiện việc giải nén. Python thấy hai tên và một tuple có hai giá trị, rồi gán chúng theo từng cặp.

Cách viết này có mặt khắp nơi trong code Python chuẩn mực:

Bạn có thể dùng * để gom "phần còn lại":

Rất tiện khi bạn chỉ quan tâm đến phần tử đầu và cuối.

Tuple làm khóa của từ điển

Vì tuple là hashable (miễn là nội dung bên trong cũng vậy), bạn có thể dùng chúng làm khóa của dict. List thì không làm được điều này:

Mẫu này, dùng một tổ hợp giá trị làm khóa, hữu ích đến bất ngờ. Hãy nghĩ đến: "điểm của người dùng X vào ngày Y" hay "đường đi tốt nhất từ A đến B".

Tuple cho nhiều giá trị trả về

Một hàm cần trả về nhiều hơn một thứ thường sẽ trả về một tuple:

Hàm có sẵn divmod() của Python làm đúng như vậy. Phép gán giải nén ở phía code gọi hàm khiến nó đọc rất tự nhiên.

Named tuple, khi vị trí thôi là chưa đủ

Khi tuple dài hơn hai hay ba phần tử, việc nhớ vị trí nào mang nghĩa gì trở nên mệt mỏi. collections.namedtuple giải quyết chuyện đó:

Giờ các phần tử của tuple đã có tên. Nó vẫn bất biến, vẫn là tuple (nên giải nén và truy cập theo chỉ số vẫn chạy), nhưng cách truy cập thân thiện hơn nhiều. Với những gì phức tạp hơn, có dataclasses; chúng ta sẽ gặp chúng sau trong chương lớp.

Tuple hay list: hướng dẫn chọn nhanh

  • Hình dạng cố định, mỗi vị trí có ý nghĩa → tuple.
  • Tập dữ liệu có thể lớn lên hoặc thu nhỏ → list.
  • Trả về nhiều giá trị từ một hàm → tuple.
  • Cần làm khóa của dict hoặc phần tử của set → tuple (list không dùng được).
  • Bạn sẽ thay đổi nó → list (tuple không cho phép).

Đi tiếp

Tuple phủ một đầu của phổ: cố định, nhỏ, có cấu trúc. Tiếp theo là set, đảm nhận một việc hoàn toàn khác: kiểm tra thành viên nhanh và đảm bảo không trùng lặp.

Câu hỏi thường gặp

Tuple trong Python là gì?

Tuple là một dãy có thứ tự và bất biến: giống list, nhưng khi đã tạo thì bạn không thể thêm, xóa hay thay đổi phần tử. Bạn viết tuple bằng dấu ngoặc tròn: point = (3, 4).

Tuple và list khác nhau thế nào?

Cả hai đều là dãy có thứ tự. List thì khả biến, bạn có thể thay đổi sau khi tạo, còn tuple thì bất biến. Tuple thường dùng cho những nhóm nhỏ các giá trị đi cùng nhau như một "bản ghi", chẳng hạn tọa độ hay nhiều giá trị trả về của một hàm.

Khi nào nên dùng tuple?

Dùng tuple khi bạn có một bản ghi kích thước cố định mà mỗi vị trí mang một ý nghĩa: tọa độ, màu RGB, một hàng trong cơ sở dữ liệu. Ngoài ra, hãy dùng tuple làm khóa của từ điển hoặc phần tử của set, vì list không dùng được ở đó. Với mọi trường hợp khác khi tập dữ liệu có thể lớn lên hay thu nhỏ, list là lựa chọn mặc định.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu