Python bài 08: Comprehension, tuple và cơ chế sao chép dữ liệu
- 18-10-2026
- Toanngo92
- 0 Comments
Giáo trình Python miễn phí · Chương 4/12: List, tuple và sao chép dữ liệu · Bài 08/24.
Mục lục
Mục tiêu bài học
Biến đổi danh sách dễ đọc, unpack tuple và tránh sửa nhầm dữ liệu qua các tham chiếu dùng chung.
Comprehension để biến đổi và lọc
Một list comprehension gồm biểu thức tạo giá trị, phần for và điều kiện lọc tùy chọn. Dùng khi phép biến đổi ngắn, rõ ràng. Nếu phải lồng nhiều điều kiện hoặc có các bước xử lý lỗi, một vòng for thông thường dễ đọc hơn.
Comprehension tạo danh sách kết quả mới, thuận tiện khi cần lọc các phần tử thay vì xóa chúng trực tiếp trong lúc duyệt. Nó vẫn tạo toàn bộ danh sách trong bộ nhớ; chương generator sẽ giới thiệu cách xử lý từng phần tử khi cần.
diem = [4, 8, 6, 9]
diem_dat = [x for x in diem if x >= 5]
binh_phuong = [x * x for x in range(1, 5)]
print(diem_dat)
print(binh_phuong)
toa_do = (10, 20)
x, y = toa_do
print(x, y)
mot_phan_tu = (10,)
print(type(mot_phan_tu).__name__)
Kết quả:
[8, 6, 9] [1, 4, 9, 16] 10 20 tuple
Tuple cố định cấu trúc ở cấp ngoài
Tuple giữ thứ tự và không cho gán lại từng phần tử. Dấu phẩy quyết định tuple một phần tử: (10,) khác (10). Tuple hữu ích biểu diễn bộ giá trị như tọa độ hoặc nhiều kết quả trả về của hàm. Unpacking cần đúng số vị trí, hoặc dùng *phan_con_lai để nhận nhiều phần tử.
Immutable của tuple không có nghĩa mọi đối tượng bên trong đều bất biến. Nếu tuple chứa một list, list đó vẫn có thể thay đổi. Chọn tuple khi muốn cấu trúc bộ giá trị ổn định; đừng xem nó là cơ chế khóa toàn bộ dữ liệu lồng nhau.
Gán tên, sao chép nông và sao chép sâu
b = a chỉ tạo thêm tên cùng trỏ đến một đối tượng. a.copy() hoặc a[:] tạo list mới nhưng các phần tử lồng nhau vẫn có thể dùng chung. deepcopy() sao chép sâu đồ thị đối tượng theo cơ chế của module copy; không nên dùng mặc định cho mọi dữ liệu vì có chi phí và các đối tượng như kết nối mạng không thể coi là dữ liệu sao chép thông thường.
from copy import deepcopy
a = [[1, 2], [3, 4]]
b = a
c = a.copy()
d = deepcopy(a)
b[0].append(9)
print(a)
print(c)
print(d)
print(a is b, a is c, a == c)
Kết quả:
[[1, 2, 9], [3, 4]] [[1, 2, 9], [3, 4]] [[1, 2], [3, 4]] True False True
Lỗi thường gặp và lưu ý
- [[0] * 3] * 2 tạo hai tham chiếu đến cùng một hàng; dùng [[0] * 3 for _ in range(2)] nếu muốn các hàng độc lập.
- Không dùng is thay cho == khi muốn so sánh nội dung hai list.
Ghi nhớ
Phân biệt danh tính và nội dung của đối tượng. Chỉ sao chép sâu khi cần độc lập cả dữ liệu lồng nhau; giữ comprehension ngắn và có ý nghĩa.

